data adapter.select command.connection

时间:2015-07-11 12:47:44

标签: c# sqldataadapter

我使用下面的代码从数据库中获取数据。但是,当断点转到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;


                    }
                }
            }

****异常详情:****

  

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

答案可能很简单,但它现在吃了将近4个小时的时间。非常感谢任何帮助。

注意: 我可以使用sqlcommand在下面的问题中使用代码,但我想尝试使用数据适配器

How to use a DataAdapter with stored procedure and parameter

2 个答案:

答案 0 :(得分:1)

您必须实例化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;

答案 1 :(得分:1)

您应该将创建的SqlConnection设置为SqlDataAdapter。没有必要打开它,因为如果适配器关闭,适配器会打开它,但必须知道连接器知道连接。

//: Playground - noun: a place where people can play

class ListItem: Hashable {

    var itemId: Int = 0
    var itemName: String = ""
    var itemDescription: String = ""
    var itemIcon: String = ""
    var parentId: Int = 0
    var postCount: Int = 0

    var hashValue: Int {
        return itemId.hashValue
    }

}

func ==(lhs: ListItem, rhs: ListItem) -> Bool {
    return lhs === rhs // simple identity
}

var dict = Dictionary<ListItem, [ListItem]>()

let arr = [ListItem(), ListItem()]

dict[ListItem()] = arr
dict[ListItem()] = arr

dict.keys.array.count

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