如何通过C#向存储过程传递NULL值

4

我有多个文本框,我希望允许用户将某些文本框保留为空,而不是显示错误。

SqlParameterCollection仅接受非空的SqlParameter类型对象。

我用于插入数据的是Data_Access_Layer类中的内容。

public void ExecuteCommand(string Data, SqlParameter[] param)
    {
        SqlCommand sqlcmd = new SqlCommand();
        sqlcmd.CommandType = CommandType.StoredProcedure;
        sqlcmd.CommandText = Data;
        sqlcmd.Connection = sqlconnection;


        if (param != null)
        {

            sqlcmd.Parameters.AddRange(param);
        }

主界面代码如下:
namespace M_Weight_System.Presentation_Layer
{
    public partial class Main : Form
    {
        Bussiness_Layer.Cls_Data dta = new Bussiness_Layer.Cls_Data();
        public Main()
        {
            InitializeComponent();
        }

        private void bSave_Click(object sender, EventArgs e)
        {
            try
            {
              dta.Add_Data(tId.Text, tNumber.Text, tClient.Text, tDriver.Text, Convert.ToInt32(tFirst.Text), Convert.ToInt32(tSecond.Text), Convert.ToInt32(rt2.Text), tDate1.Text,tCity.Text, tType.Text,tDate2.Text);
                MessageBox.Show("Success");
                bEdit.Enabled = true;
                NewToolStripMenuItem.Enabled = true;
                PrintToolStripMenuItem.Enabled = false;
            }
            catch
            {
                MessageBox.Show("Problem !");
            }
        }

        private void bEdit_Click(object sender, EventArgs e)
        {
            try
            {
                dta.Update_Data(tId.Text, tNumber.Text, tClient.Text, tDriver.Text, Convert.ToInt32(tFirst.Text), Convert.ToInt32(tSecond.Text), Convert.ToInt32(rt2.Text), tDate1.Text, tCity.Text, tType.Text, tDate2.Text);
                MessageBox.Show("Success");

            }
            catch
            {
                MessageBox.Show("Problem !");
            }

        }
        }
}

3
string.EmptynullDbNull.Value 是三个不同的值。如果您的文本框为空,可能需要将 DbNull.Value 添加到 param 中。请注意,翻译时需保持原文意思不变,且不添加解释。 - Dour High Arch
1
你需要发表你的代码,其中包括创建和设置 "SqlParameter" 对象的 ".Value" 成员。 - Dai
此外,您需要将 SqlCommand 包装在 usingtry/finally 块中,以确保其正确释放。 - Dai
我对数据库不太熟悉,你能告诉我在哪里使用 DbNull.Value 吗? - Mohamed Ali
我用代码@Dai编辑了这篇文章。 - Mohamed Ali
2个回答

8

你可以尝试使用这个命令:command.Parameters.Add("@param", DBNull.Value); 或者在存储过程中将默认值设置为 NULL,这样你就不必显式地传递 NULL 给存储过程。

CREATE PROC ..dbo.Proc ( @param1 int =NULL, @param2 varchar(40) = NULL ...)

此外,如果你需要从你的应用程序发送 NULL 值,你将使用 DBNull.Value。

1
避免使用AddWithValue! 改用.Add( ... ).Value = value; 替代。 https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ - Dai

2
您可以简单地使用。
sqlcmd.Parameters.AddRange(param == null ? (object)DBNull.Value : param);

它给了我“无法从'System.Data.SqlClient.SqlParameter []'转换” - Mohamed Ali
1
严重程度 代码 描述 项目 文件 行 抑制状态 错误 CS1503 参数1:无法将“object”转换为“System.Data.SqlClient.SqlParameter[]” M Weight System C:\Users\Mohamed\source\repos\M Weight System\M Weight System\Data Access Layer\DataAcessLayer.cs 69 活动的 - Mohamed Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接