2012-12-12 103 views
1

我想將數據插入到數據庫表:我怎樣才能解決這個錯誤的C#

myCommand.CommandText = "INSERT INTO Selectionner (IdPrestation, 
    IdPhrase, DegreUrgence,RisqueConcerne,rowguid,Cotation) " +                
    "VALUES ('" +new Guid(emp.IdPrestation) + 
    "', '" +new Guid(emp.IdPhrase)+ "', '" + 
    emp.DegreUrgence + "','" + emp.RisqueConcerne + "','" + 
    new Guid(emp.rowguid) + "','" + emp.Cotation + "')"; 

但這返回一個錯誤:

Guid should contain 32 digits with 4 dashes
(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).

我怎樣才能解決這個問題?

+5

,不要串聯SQL字符串,但使用的參數,以避免SQL注入和解析錯誤。我們需要以下變量的值來回答你的問題:'emp.IdPrestation','emp.IdPhrase','emp.rowguid'。你正在使用它們來初始化'GUIDs',它必須包含32個數字並且有4個破折號(錯誤是不言自明的,不是嗎?)。 –

+0

您可以給emp.IdPrestation,emp.IdPhrase和emp.rowguid一些示例值嗎? – SWeko

回答

6

一個或多個的你

emp.IdPrestation //Or 
emp.IdPhrase //Or 
emp.rowguid //Check them before creating 

是/不是GUID這就是它拋出錯誤的原因。

編輯:開始

如何使用Guid.TryParse()返回true,如果分析操作成功;否則,是錯誤的。

//How to parse safely 
Guid IdPrestation; 
Guid IdPhrase; 
Guid rowguid; 

if(Guid.TryParse(emp.IdPrestation, out IdPrestation) && 
    Guid.TryParse(emp.IdPhrase, out IdPhrase) && 
    Guid.TryParse(emp.rowguid, out rowguid)) 
{ 
    //all variables have been parse successfully 
    //Execute the sql query as follows using parameters 
} 

編輯:結束

此外,將參數傳遞的直接串聯SQL是unsafe bad practice。相反use a parameterised query

myCommand.CommandText = "INSERT INTO yourTableName (c1, c2, ...) 
VALUES (@p1, @p2,...)"; 
myCommand.Parameters.Add(new SqlParameter("p1", valueforCol1)); 
myCommand.Parameters.Add(new SqlParameter("p2", valueforCol2)); 
... 
4

嘗試使用參數化查詢作爲第一項改進。然後,嘗試使用Guid.Parse(string s)而不是new Guid(string s)。這樣,我預計會出現一個例外情況,對於不合規的字符串。

該構造函數可能有點寬容,在這種情況下,你會想快速失敗,以便知道什麼字段給你帶來麻煩。

+0

現在,我使用'Guid.Parse(字符串s)',但同樣的錯誤 –

+0

但是,由於解析不能完成的錯誤?或者Parse成功,但實際的Insert會產生異常? – dutzu

+0

@ B.M.A檢查我最近的編輯。 – Kaf

1

你不能簡單的字符串創建GUID,字符串必須符合的GUID

Guid originalGuid = Guid.NewGuid(); 
originalGuid.ToString("B") gets converted to {81a130d2-502f-4cf1-a376-63edeb000e9f} 

同樣

"N" - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (32 digits) 
"D" - xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (32 digits separated by hyphens) 
"B" - {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} (same as "D" with addition of braces) 
"P" - (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) (same as "D" with addition of parentheses) 
"X" - {0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00.0x00}} 

的GUID本身沒有格式。這只是一個價值。請注意,您可以使用NewGuid或使用guid的構造函數來創建guid。使用NewGuid,您無法控制guid的值。使用guid的構造函數,您可以控制該值。如果您已經有了guid的字符串表示形式(也許您從數據庫中讀取它)或者想要在開發過程中更輕鬆地解釋guid,那麼使用構造函數將非常有用。您還可以使用ParseParseExactTryParseTryParseExact方法。

所以,你可以像這樣創建的GUID:

Guid g1 = Guid.NewGuid(); //Get a Guid without any control over the contents 
Guid g2 = new Guid(new string('A',32)); //Get a Guid where all digits == 'A' 
Guid g3 = Guid.Parse(g1.ToString()); 
Guid g4 = Guid.ParseExact(g1.ToString("D"),"D"); 
Guid g5; 
bool b1 = Guid.TryParse(g1.ToString(), out g5); 
Guid g6; 
bool b2 = Guid.TryParseExact(g1.ToString("D"),"D", out g6); 
相關問題