如何解决此错误c#

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

标签: c# sql sql-server sql-server-2008

我想将数据插入数据库表:

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应包含32位数字,带4个破折号   (XXXXXXXXXXXX-XXXXXXXX-XXXXXXXXXXXX)。

如何解决此错误?

3 个答案:

答案 0 :(得分: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));
...

答案 1 :(得分:4)

尝试使用参数化查询作为第一个改进。

然后,尝试使用Guid.Parse(string s)代替new Guid(string s)。这样,我预计会针对不符合的字符串引发异常。

构造函数可能有点宽容,在这种情况下,您可能希望快速失败,以便您知道哪个字段给您带来麻烦。

答案 2 :(得分: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);