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

时间:2012-02-28 12:36:09

标签: c# sql-server-ce parameterized

在开发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)

这导致以下错误:A parameter is not allowed in this location. Ensure that the '@' sign is in a valid location or that parameters are valid at all in this SQL statement.

经过几个小时的阅读文档和其他帖子,为什么我不能在这些地方使用变量,我只是试图在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)

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

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

1 个答案:

答案 0 :(得分:3)

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