2011-03-17 66 views
2

我有一個.dbproj項目部署下面的描述中創建的SQL Server數據庫表:如何將GUID值傳遞給SqlCommand對象SQL INSERT語句?

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()運行一個豁免被拋出說

在此上下文中不允許名稱[我通過的GUID的字符串表示形式]。

這是怎麼回事?我也是這樣做的,以前將數據插入到SQLite表中並且工作正常。如何將GUID傳遞到SQL INSERT語句中?

+2

單引號(''')。 – 2011-03-17 10:57:31

+0

請勿使用單引號 - 請改用**參數化查詢**!更安全....你可以拼寫[SQL注入攻擊?](http://xkcd.com/327/) – 2011-03-17 11:03:54

回答

10

使用參數化查詢,像這樣:

command.CommandText = "INSERT INTO Tasks VALUES(@id, 0)"; 
command.Parameters.Add("@id", SqlDbType.UniqueIdentifier, 16).Value = value; 

通過這種方式,數據庫驅動程序格式,讓您的值。這是一個很好的做法,它也有助於保護數據庫免受SQL注入攻擊。

或者,你可以讓數據庫生成的GUID爲您提供:

command.CommandText = "INSERT INTO Tasks VALUES(NEWID(), 0)";
+0

+1不能說更好! – 2011-03-17 11:16:38