让C#在SQL Server中插入默认值

让C#在SQL Server中插入默认值,c#,sql-server,dbnull,executenonquery,default-constraint,C#,Sql Server,Dbnull,Executenonquery,Default Constraint,如何将存储在字符串[]中的值插入到SQL Server中,以便忽略某些值,而将存储在SQL Server中的值作为表上的默认约束?要使用这些默认值,我需要传递什么(例如NULL或其他内容) 目前,我在我的代码中添加了所有默认值,它变得越来越庞大 下面是我的代码: if (value == "") value = "0"; string insert = "INSERT INTO " + table + " (" + columns + ") VALUES (" + atColumns + ")

如何将存储在
字符串[]
中的
值插入到SQL Server中,以便忽略某些值,而将存储在SQL Server中的值作为表上的默认约束?要使用这些默认值,我需要传递什么(例如NULL或其他内容)

目前,我在我的代码中添加了所有默认值,它变得越来越庞大

下面是我的代码:

if (value == "") value = "0";

string insert = "INSERT INTO " + table + " (" + columns + ") VALUES (" + atColumns + ")";

using (SqlConnection connect = new SqlConnection(connection))
{                               
    using (SqlCommand command = new SqlCommand(insert, connect))
    {
        //adds values to corresponding parameters
        for (int i = 0; i < table_cols.Length; i++)
        {
            command.Parameters.AddWithValue("@" + table_cols[i], table_vals[i]);
        }

        foreach (SqlParameter Parameter in command.Parameters)
        {
            if (Convert.ToString(Parameter.Value) == "")
            {
                Parameter.Value = DBNull.Value;
            }
        }

        connect.Open();
        command.ExecuteNonQuery();
        response = "Success";
        return response;
if(value==“”)value=“0”;
string insert=“插入“+table+”(“+columns+”)值(“+atColumns+”);
使用(SqlConnection=newsqlconnection(连接))
{                               
使用(SqlCommand=newsqlcommand(插入,连接))
{
//将值添加到相应的参数
对于(int i=0;i
如果特定的
参数.Value
不为null,并且SQL Server设置了默认值,则此代码将无法使用null


在SQL Server中,可以通过省略insert语句中的值来处理此问题(此省略会触发插入表的默认值,而提供null则会产生错误)。

我能想到的唯一其他方法是基于触发器的方法(此时最好对其进行编码)


但是,如果您改变使用存储过程的方法,您可以在SQL中以本机方式进行值处理,否则您将无法将其编码到应用程序中……我是否可以推荐三元语句作为您的示例:。

如果您在列列表中包括一列,它将尝试插入您提供的值,而不是>NULL
表示“只需插入默认值”

如果不想在该列中插入值,请不要将其包含在列列表(或值列表)中


虽然循环遍历表列似乎更有效,并且不知道列名、类型等。但从长远来看,最好显式处理每一列,以便选择是否使用默认值、验证值等。

传入NULL告诉SQL您希望该列中的NULL覆盖de错误。如果您想在关键字DEFAULT中传递某些内容。我写了一篇关于用法的文章:

DEFAULT关键字会将默认值(来自约束)插入到列中


请记住,传入默认值时,不要在其周围加引号。这使其成为字符串默认值,而不是关键字默认值。

如果希望SQL Server对列使用默认值约束,则不要将该列作为插入参数的一部分

例如:

--From SQL Server
CREATE TABLE Orders
(
     Id INT IDENTITY PRIMARY KEY
    ,Amount INT NOT NULL
    ,Cost MONEY NOT NULL
    ,SaleDate DATE NOT NULL DEFAULT GETUTCDATE()
);



//From C#
public int Insert(decimal cost, int amount)
{
    using (var connection = new SqlConnection(connectionString))
    {
        var command = connection.CreateCommand();
        //Don't specify the SaleDate and it will insert the current time
        command.CommandText = "INSERT INTO Orders(Amount, Cost) VALUES(@Amount, @Cost); SELECT SCOPE_IDENTITY();";
        command.Parameters.AddWithValue("@Amount", amount);
        command.Parameters.AddWithValue("@Cost", cost);

        using(var reader = command.ExecuteReader())
        {
            if(reader.Read())
                return Convert.ToInt32(reader[0]);
        }
    }

    return 0;
}

如果您想在C代码中使用参数列表,那么只需将参数名称与其值分组,如果该值为null且具有默认值,则只需跳过它。

我实际上使用了
信息模式。COLUMNS
表从SQL Server中提取所有列默认值。然后我只是组织了默认值将ts插入一个
字符串[]
,并在其中循环以插入默认值而不是空值(某些默认值为空).

你的最后一句话-这是解决方案,真的。如果你想让SQL Server默认启动-不要在该列中插入任何内容!我感谢你的及时回复。问题是,这是一种我想更一般地使用的方法。对于每个不同的表,我不想进入并手动不发送这些值。我希望能够发送字符串数组中的所有值,不管是否为null,如果可能的话,让代码只插入它。此外,您的catch块不做任何事情,这很糟糕……我将其切断。哈哈。它处理错误并返回字符串。Parameter.Value=default;错误:预期“(”@当然最好不要,这是胡说八道:SQL语法!=C#代码。在任何情况下,请参见-您可能必须手动构建这些值,这在某种程度上就像从一开始就忽略了列一样。(但无论哪种情况,这都很简单-只需将参数/参数绑定到要指定值的列!)感谢您的及时回复。问题是,这是一种我想更一般地使用的方法。对于每个不同的表,我不希望必须进入并手动不发送这些值。我希望能够发送字符串数组中的所有值,无论是否为null,并让代码插入它,如果可能的话。好的,那么您需要d决定如何确定
NULL
值是指“插入默认值”(如果有)还是“插入
NULL
”。另外,如果你遗漏了一个不可为null的列,而该列没有默认值,你会得到一个错误。是的,这很好。我处理了这些。我已经决定了,并且有可用的代码。我只是希望有类似DBNull.value的东西,它会先插入默认值,然后再插入null,或者其他任何不同的方式为了实现这一点。感谢您的回复。它们的用处是什么?它们使您的代码看起来干净整洁,而不是if-else语句,如果您在C#中分隔出括号,则该语句至少需要8行。Ternary在1行中完成。