数据适配器.select命令.connection

3
我正在使用以下代码从数据库中获取数据。但是,当断点到达var k之后的任何一行时,立即会引发异常。
 DataSet ds = new DataSet();
            try
            {
                using (SqlConnection con = new SqlConnection())

                {
                    con.ConnectionString = @"Data Source = sql\db1,5000; Initial Catalog = uatdb; Integrated Security = SSPI";

                    using (SqlDataAdapter da = new SqlDataAdapter())
                    {
                        var k = con.State;

更新:
从答案中添加了这行代码,但是没有帮助,仍然存在相同的错误。

                        da.selectcommand=new sqlcommand();

                        da.SelectCommand.Connection.ConnectionString= con.ConnectionString;
                        da.SelectCommand.CommandText = "usp_checkstatus";
                        da.SelectCommand.Parameters.Add("@id", SqlDbType.Int).Value = TextBox1.Text.ToString(); ;
                        da.SelectCommand.CommandType = CommandType.StoredProcedure;


                        //  da.SelectCommand.Parameters.AddWithValue("@buildid", TextBox1.Text);

                        da.Fill(ds);
                        return ds;


                    }
                }
            }

****异常详细信息:****

对象引用未设置为对象实例。连接状态始终关闭,DB连接字符串是正确的,我没有打开连接,因为数据适配器会为我打开连接。

答案可能很简单,但已经花费了我将近4个小时的时间。非常感谢任何帮助。

注意:我可以使用下面问题中的代码使其正常工作,但我想尝试使用数据适配器。

如何使用带参数的存储过程和DataAdapter


1
这是你的真实代码吗?因为如果大小写不正确,它将无法编译。 - Crowcoder
正在编译,我已经删除了唯一的 catch 块。我从 VS 中复制粘贴了代码。 - TheGameiswar
2个回答

2
您需要实例化SelectCommand属性:
 using (SqlDataAdapter da = new SqlDataAdapter())
   {
    da.SelectCommand = new SqlCommand();
    da.SelectCommand.Connection=con;
    ..
   }

或者创建 SqlCommand 对象,并将其引用分配给 SelectCommand 属性。

var cmd = new SqlCommand();
cmd.CommandText = "your-proc-name";
cmd.Connection = con;
.....
adp.SelectCommand = cmd;

首先非常感谢您的及时回复,但问题仍然存在。我已经按照您的建议更新了我的问题,并附上了代码。 - TheGameiswar
@TheGameiswar 将 con 引用设置为 Connection 属性。 - KV Prajapati

2

您需要将创建的SqlConnection设置为SqlDataAdapter。不必打开它,因为如果未关闭,则适配器会为您打开它,但是适配器知道连接非常重要。

DataSet ds = new DataSet();
try
{
    using (SqlConnection con = new SqlConnection(@"Data Source = sql\db1,5000; 
           Initial Catalog = uatdb; Integrated Security = SSPI"))
    using (SqlDataAdapter da = new SqlDataAdapter("usp_checkstatus", con))
    {
        da.SelectCommand.CommandType = CommandType.StoredProcedure;
        da.SelectCommand.Parameters.Add("@id", SqlDbType.Int).Value = Convert.ToInt32(TextBox1.Text);
        da.Fill(ds);
        return ds;
    }
}

此外,无需创建特定的SqlCommand。当您创建适配器并传递存储过程名称时,会自动为您创建一个新的SqlCommand,当然您仍然需要设置其参数和CommandType。(关于参数的说明,我不确定这是否会导致您的存储过程产生错误结果,但如果您想传递整数,则将输入转换为整数似乎是安全的)


感谢您提供的整数转换额外提示。 - TheGameiswar

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