我想将数据插入数据库表:
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)。
如何解决此错误?
答案 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,那么使用构造函数很有用。您还可以使用Parse,ParseExact,TryParse和TryParseExact方法。
所以,你可以创建这样的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);