gpt4 book ai didi

c# - 为什么在这种情况下 CONVERT() 允许我使用参数化查询?

转载 作者:行者123 更新时间:2023-11-30 16:25:50 27 4
gpt4 key购买 nike

在开发 windows 移动应用程序期间,我们使用了以下代码:

const string sqlString2 = 
@"INSERT INTO WorkOrderComment
(WOInstructionID,WorkOrderCommentID,ClientChange,Void,UserID,VoidTimestamp)
(SELECT WOInstructionID, WOInstructionID, 1, @VoidBit,@VoidUser ,@VoidTimeStamp
FROM WorkOrderInstruction
WHERE InstructionGroupQuestion = 0 AND InstructionGroupNumber = @insGroupNo AND WorkOrderID=@WoID)";
var sqlcom2 = new SqlCeCommand();
sqlcom2.CommandType = CommandType.Text;
sqlcom2.CommandText = sqlString2;
sqlcom2.Parameters.Add("@VoidBit", action);

sqlcom2.Parameters.Add("@VoidUser", DBNull.Value);
sqlcom2.Parameters.Add("@VoidTimeStamp", DBNull.Value);

sqlcom2.Parameters.Add("@WoID", workOrderID);
sqlcom2.Parameters.Add("@insGroupNo", instructionGroupNumber);
sqlcom2.ExecuteNonQuery();

运行此命令时,我在 ExecuteNonQuery 上收到以下错误: 不支持转换。 [要转换的类型(如果已知)= int,要转换为的类型(如果已知)= uniqueidentifier]

即使我添加 sqlcom2.Parameters["@VoidUser"].DbType = DbType.Guid; 我也遇到了同样的错误。一段时间后,我发现使用 CONVERT 可以对此有所帮助。我将 @VoidUser 更改为 CONVERT(uniqueidentifier,@VoidUser)

这导致了以下错误:此位置不允许使用参数。确保“@”符号位于有效位置或此 SQL 语句中的参数完全有效。

在阅读了几个小时的文档和其他关于为什么我不能在这些地方使用变量的帖子后,我只是试着在所有地方都输入 CONVERT;将 @VoidBit 更改为 CONVERT(bit,@VoidBit) 并将 @VoidTimeStamp 更改为 CONVERT(datetime,@VoidTimeStamp) .

出于某种原因,它起作用了。

表是用这个命令创建的:

CREATE TABLE WorkOrderComment (  WorkOrderCommentID uniqueidentifier NOT NULL CONSTRAINT WorkOrderCommentPK Primary Key,
WOInstructionID uniqueidentifier NOT NULL,
WorkOrderID_Update uniqueidentifier NULL,
TextData NTEXT NULL,
Value float NULL,
Category nvarchar(50) NULL,
BarcodeScanned bit NULL,
Timestamp DateTime NULL,
Time float NULL,
UserID uniqueidentifier NULL,
Void bit NULL,
VoidTimeStamp DateTime NULL,
FaultComplaintID uniqueidentifier NULL,
ClientChange bit NOT NULL)

为什么不允许我使用“裸”参数?

为什么首先会在转换时抛出错误,而不是在使用参数时抛出错误?

最佳答案

Parameters.Add()方法有 2 个参数:参数名称和数据类型。您似乎对 Parameters.AddWithValue() 感到困惑

此外,SQLCE 似乎比 SQL Server 更难进行类型转换。所以最好是你特别提到参数的类型。 (虽然它只对 uniqueidentifier 很重要)

我也会像这样稍微重写代码:

        using (var sqlConn = new SqlCeConnection(connStr))
using (var sqlCmd = new SqlCeCommand(sqlString2, sqlConn))
{
sqlConn.Open();

sqlCmd.Parameters.Add("@VoidBit", SqlDbType.Bit).Value = action;
sqlCmd.Parameters.Add("@VoidUser", SqlDbType.UniqueIdentifier).Value = DBNull.Value;
sqlCmd.Parameters.Add("@VoidTimeStamp", SqlDbType.DateTime).Value = DBNull.Value;
sqlCmd.Parameters.Add("@WoID", SqlDbType.UniqueIdentifier).Value = workOrderID;
sqlCmd.Parameters.Add("@insGroupNo", SqlDbType.Int).Value = instructionGroupNumber;

sqlCmd.ExecuteNonQuery();
}

参见 https://gist.github.com/1932722完整的重现脚本

关于c# - 为什么在这种情况下 CONVERT() 允许我使用参数化查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9482012/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com