首页 > 解决方案 > ASP.Net\C# SQL 参数 DBNull

问题描述

我正在努力为 C# \ ASP.Net 使用 SQL 参数,而不是在 ASP.Net 中使用 C#,对它来说太新了,我有一个带有下拉框 (drpdSerType) 和一个文本框 (txtRNumSer) 和一个按钮的网页,按钮代码如下...

如果我不使用注释代码中看到的参数,那么它可以正常工作......

            try
            {
            SqlConnection con = new SqlConnection();
            SqlDataAdapter sda = new SqlDataAdapter();
            DataTable dt = new DataTable();
            con.ConnectionString = "Server=server1;Database=db1;Integrated Security=True";
            sda.SelectCommand.Parameters.AddWithValue("@I", drpdSerType.SelectedValue.ToString());
            sda.SelectCommand.Parameters.AddWithValue("@S", txtRNumSer.Text);
            sda = new SqlDataAdapter("SELECT Number, Type, Qty, Date, num, ReceiptID FROM IssuedRN WHERE @I = @S", con);
            //This line works but no secure
            //sda = new SqlDataAdapter("SELECT Number, Type, Qty, Date, num, ReceiptID FROM IssuedRN WHERE " + drpdSerType.SelectedValue.ToString() + " = '" + txtRNumSer.Text + "'", con);
            sda.Fill(dt);
            GridView1.DataSource = dt;
            GridView1.DataBind();

我收到以下错误;System.NullReferenceException:“对象引用未设置为对象的实例。” 与线路有关

sda.SelectCommand.Parameters.AddWithValue("@I", drpdSerType.SelectedValue.ToString());

我也遵循了这里的指导; https://csharp-station.com/Tutorial/AdoDotNet/Lesson06

感谢您对此的任何帮助,我尝试了许多不同的方法来使用参数,但似乎都这样做或给出了上述错误。

谢谢卡尔

更新:

我已经添加了一个由下拉列表驱动的 switch 语句,所以参数 @I 现在是硬编码的......

string qryselect = drpdSerType.SelectedValue.ToString();
        string cmd = "";

        switch (qryselect)
        {
            case "Number":
                cmd = "SELECT Number, Type, Qty, Date, RNum, ReceiptID FROM IssuedRN WHERE Number = @S";
                break;
            case "RNum":
                cmd = "SELECT Number, Type, Qty, Date, RNum, ReceiptID FROM IssuedRN WHERE RNum = @S";
                break;
            case "ReceiptID":
                cmd = "SELECT Number, Type, Qty, Date, RNum, ReceiptID FROM IssuedRN WHERE ReceiptID = @S";
                break;
        }

我猜我在将下拉列表中的值传递给 SQL 参数时遗漏了一些东西,因为这些值是预先填充的并且匹配列和查询,它们永远不会为空。

标签: c#sqlasp.net

解决方案


你有一个错误

"SELECT Number, Type, Qty, Date, num, ReceiptID FROM IssuedRN WHERE @I = @S"

WHERE @I = @S" 这是什么?

并修复其余部分

con.ConnectionString = "Server=server1;Database=db1;Integrated Security=True";

var sqlString="....fixed sql";
var cmd = new SqlCommand(sqlSting, con);

var value= drpdSerType.SelectedValue;
if(value == null)
        cmd.Parameters.AddWithValue("@I", DBNull.Value);
  else
        cmd.Parameters.AddWithValue("@I", value.ToString());

cmd.Parameters.AddWithValue("@S", txtRNumSer.Text);

 sda = new SqlDataAdapter();
sda.SelectCommand=cmd;
 sda.Fill(dt);
 .....        

推荐阅读