C# 如何向Uniqueidentifier列插入空值
在我的C#项目中,我需要在UniqueIdentifier列中插入一些空值 对于字段city Guid,state Guid字段,我应该能够插入空值 如果没有可用的值(uniqueidentifier)。 我得到以下错误 “从字符串转换为uniqueidentifier时,转换失败。” 这是我的密码C# 如何向Uniqueidentifier列插入空值,c#,.net,C#,.net,在我的C#项目中,我需要在UniqueIdentifier列中插入一些空值 对于字段city Guid,state Guid字段,我应该能够插入空值 如果没有可用的值(uniqueidentifier)。 我得到以下错误 “从字符串转换为uniqueidentifier时,转换失败。” 这是我的密码 string Query = @"INSERT INTO mytable (table_GUID,
string Query = @"INSERT INTO mytable
(table_GUID,
Date,
city_GUID,
state_GUID,
)
VALUES
('" + tableGUID + @"',
'" + Date + @"',
'" + cityGUID + @"',
'" + stateGUID + @"'
)
string insert = sql.executeNonQuery(Query);
您不应该提供这样的值。创建SqlCommand并将值作为参数提供。要插入空值,请使用
DBNull.Value
var command = new SqlCommand(
@"INSERT INTO mytable (table_GUID, Date, city_GUID, state_GUID)
VALUES (@TableGuid, @Date, @CityGuid, @StateGuid)", sqlConnection);
command.Parameters.AddWithValue("TableGuid", tableGUID ?? DBNull.Value);
command.Parameters.AddWithValue("Date", Date);
command.Parameters.AddWithValue("CityGuid", cityGUID ?? DBNull.Value);
command.Parameters.AddWithValue("StateGuid", stateGUID ?? DBNull.Value);
command.ExecuteNonQuery();
另一种方法是提供NULL作为值。看
您还可以定义一个helper函数来返回用引号括起来的值或空字符串
private string GetQuotedParameterThing(Guid? value)
{
return value == null ? "NULL" : "\"+ value + \"";
}
然后只需向您的命令字符串提供
GetQuotedParameterThing(tableGUID)
。已经有一个答案显示了如何使用ADO.NET参数执行此操作,这是对此问题的完全正确答案。如果必须使用原始TSQL,则需要区分空值/非空值;非空值需要引号,但空值需要作为null
-无引号发送null
是一个完全有效的可为null的唯一标识符,但'null'
不是
但是,在您的示例中,我怀疑真正的技巧是将sql.executeNonQuery
方法更改为接受参数。如果您没有:那么我向您保证,您当前的系统已从根本上被破坏。马上这很危险。一个问题。危险的
但这很容易解决;在你的情况下,可笑的容易;例如,这可能是:
const string Query = @"
INSERT INTO mytable (table_GUID, Date, city_GUID, state_GUID)
VALUES (@tableGUID, @Date, @cityGUID, @stateGUID)";
string insert = sql.executeNonQuery(
Query, new { tableGUID, Date, cityGUID, stateGUID });
^^^ hot damn! who knew parameterization could be that easy!?
如果您只是简单地将现有的executeNonQuery
方法设置为:
void executeNonQuery(string query, object args = null) {
//... not shown: your code that gets a connection
connection.Execute(query, args);
//... not shown: your code that cleans up
}
只需添加对的引用;简单地说,简洁使正确的参数化变得轻而易举;上述更改可以在不影响任何现有代码的情况下进行,除非允许将来对其进行参数化。我认为问题可能在于您的代码允许“空字符串”通过。也许您可以检查string.Empty,然后传入Guid.Empty或NULL。第一件事:Guid对象在C#中是实际的Guid吗?问题是它们并不总是NULL。如果没有值,那么我应该插入null。如果有一个值,那么我应该用单引号插入Guid。如何在上述方法中插入不带单引号的null?单引号导致问题,请参见我的编辑。如果参数为null,则可以使用null合并运算符提供DBNull.Value。谢谢您的回复,但我无权访问sqlCommand。sqlCommand在另一个类中。您是否可以用我正在使用的格式显示您的示例?感谢你help@Henry应使用
SqlCommand
,否则易受sql注入攻击。简单地说,您正在编写糟糕的代码。不要这样做。如果你没有访问权限,你需要获得访问权限。重构代码。就这么简单,“那么我应该用单引号插入Guid”-不,你不应该UniqueIdentifier
不是字符串-将它们视为字符串可能是这里的一个主要问题。Malvin建议将它们作为ADO.NET参数传递是完全正确的,ADO.NET参数可以通过DBNull.Value