2

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

对于城市 Guid 字段、州 Guid 字段,如果没有可用的值(唯一标识符),我应该能够插入空值。我收到以下错误

“从字符串转换为唯一标识符时转换失败。”

这是我的代码。

   string Query = @"INSERT INTO mytable
                            (table_GUID,
                            Date,
                            city_GUID,
                            state_GUID,                            
                            ) 

                        VALUES
                        ('" + tableGUID + @"', 
                        '" + Date + @"',  
                        '" + cityGUID + @"',
                        '" + stateGUID + @"'
                    )                       

 string insert = sql.executeNonQuery(Query);
4

3 回答 3

8

您不应该提供这样的值。创建一个 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 作为值。查看如何将空值插入 sql server

您还可以定义一个辅助函数来返回用引号括起来的值或 NULL 字符串。

private string GetQuotedParameterThing(Guid? value)
{
    return value == null ? "NULL" : "\"+ value + \"";
}

然后只需提供GetQuotedParameterThing(tableGUID)给您的命令字符串。

于 2013-06-07T21:17:52.663 回答
1

已经存在一个答案,显示如何使用 ADO.NET 参数执行此操作,这是对此问题的完全正确答案。如果必须使用原始 TSQL,则需要区分空值/非空值;非空值将需要引号,但空值将需要作为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
}

只需添加对dapper的引用;简单地说,dapper 使正确的参数化变得轻而易举;可以在不影响任何现有代码的情况下进行上述更改,除非允许将来对其进行参数化。

于 2013-06-07T22:41:27.350 回答
0

我认为问题可能是您的代码允许“空字符串”通过。也许您可以检查 string.Empty 然后传入 Guid.Empty 或 NULL 代替。

于 2014-08-13T20:19:20.607 回答