为什么 CONVERT() 允许我在这种情况下使用参数化查询
本文关键字:参数 查询 这种情况下 CONVERT 允许我 为什么 | 更新日期: 2023-09-27 18:26:05
在开发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();
当运行它时,我在执行非查询上收到以下错误: 不支持转换。[ 要转换的类型(如果已知(= int,要转换为的类型(如果已知(= 唯一标识符 ]
即使我添加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)
为什么不允许我使用"裸"参数?
为什么它首先在转换上抛出错误,而不是参数的使用?
Parameters.Add(( 方法有 2 个参数:参数名称和数据类型。看来你混淆了参数.AddWithValue((
此外,SQLCE在类型转换方面似乎比SQL Server更困难。所以最好是你特别提到参数的类型。(不过,它只对唯一标识符真正重要(
我也会像这样稍微重写代码:
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