Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何向Uniqueidentifier列插入空值_C#_.net - Fatal编程技术网

C# 如何向Uniqueidentifier列插入空值

C# 如何向Uniqueidentifier列插入空值,c#,.net,C#,.net,在我的C#项目中,我需要在UniqueIdentifier列中插入一些空值 对于字段city Guid,state Guid字段,我应该能够插入空值 如果没有可用的值(uniqueidentifier)。 我得到以下错误 “从字符串转换为uniqueidentifier时,转换失败。” 这是我的密码 string Query = @"INSERT INTO mytable (table_GUID,

在我的C#项目中,我需要在UniqueIdentifier列中插入一些空值

对于字段city Guid,state Guid字段,我应该能够插入空值 如果没有可用的值(uniqueidentifier)。 我得到以下错误

“从字符串转换为uniqueidentifier时,转换失败。”

这是我的密码

   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