我有一个通过在.dbproj项目中部署以下描述而创建的SQL Server数据库表:
CREATE TABLE [dbo].[Tasks] ( TaskId uniqueidentifier primary key, State int not null, )
我想用以下代码在该表中插入一行:
using( SqlTransaction transaction = connection.BeginTransaction() ) { using( SqlCommand command = connection.CreateCommand() ) { command.CommandText = "INSERT INTO Tasks VALUES( \"" + Guid.NewGuid().ToString() + "\", 0)"; command.Transaction = transaction; command.ExecuteNonQuery(); transaction.Commit(); } }
当ExecuteNonQuery()运行一个exeption被抛出说
ExecuteNonQuery()
在这种情况下,不允许使用名称[我传递的GUID的字符串表示形式]。
这是怎么回事?我做了同样的事情,以将数据先前插入到SQLite表中,并且它起作用了。如何将GUID传递到SQL INSERT语句?
使用参数化查询,如下所示:
command.CommandText = "INSERT INTO Tasks VALUES( @id, 0)"; command.Parameters.Add( "@id", SqlDbType.UniqueIdentifier, 16 ).Value = value;
这样,数据库驱动程序会为您格式化值。这是一个好习惯,也将有助于保护您的数据库免受SQL Injection攻击。
或者,您可以让数据库为您生成GUID:
command.CommandText = "INSERT INTO Tasks VALUES( NEWID(), 0)";