CommandText属性未初始化

时间:2014-07-11 11:26:45

标签: c# sql

我似乎只是在我改变了我的工作代码以使用数据视图而不是文本框来显示单行数据之后才遇到这个问题。

我有以下内容:

static SqlConnection dbConnection = new SqlConnection
                       (DBConnection.DBConnection.connectionString);        
    SqlDataAdapter holdone = new SqlDataAdapter(getCommand, dbConnection);      

    DataSet holdall = new DataSet();
    DataSet updateall = new DataSet();
    DataTable invoiceTable = new DataTable();

    DataView invoiceView = new DataView();

使用的

public void GetOne(/* connectionString, string invref, string tableref*/)
    {

getCommand = "select *redacted* from " + tableref +  
                                      "where *redacted* = " + invref;

        using (SqlConnection dbConnection = new SqlConnection
                               (DBConnection.DBConnection.connectionString))
        {
                dbConnection.Open();

            holdone.Fill(holdall);

            invoiceTable = holdall.Tables[0];

            dbConnection.Close();


        }

        DataRowView rowView = invoiceView.AddNew();

            rowView["*redacted*"] = invoiceTable;

            rowView.EndEdit();
    }

错误报告holdone.fill(holdall)为违规行,但我不确定为什么,因为我没有使用SQLCommand作为参数,而是使用SQLDataAdapter的参数

我在努力想知道自己哪里出错了?

3 个答案:

答案 0 :(得分:3)

问题是您SqlDataAdapter的选择命令字符串设置为getCommand当前值行:

SqlDataAdapter holdone = new SqlDataAdapter(getCommand, dbConnection); 

但是,由于字符串不是真正的指针,更改getCommand后跟不会更改 SqlDataAdapter的选择命令。

您需要做的是:

public void GetOne(/* connectionString, string invref, string tableref*/)
{

    getCommand = "select *redacted* from " + tableref + "where *redacted* = " + invref;
    using (SqlConnection dbConnection = new SqlConnection(DBConnection.DBConnection.connectionString))
    {
        dbConnection.Open();

        holdone.SelectCommand = new SqlCommand(getCommand, dbConnection);
        holdone.Fill(holdall);

        invoiceTable = holdall.Tables[0];
        //dbConnection.Close(); // This line is unnecessary, as the connection will be closed by `using`
    }

    DataRowView rowView = invoiceView.AddNew();
    rowView["*redacted*"] = invoiceTable;
    rowView.EndEdit();
}

答案 1 :(得分:1)

在您为实际的SQL命令分配之前,您似乎已将getCommand传递给SqlDataAdapter构造函数。首先将getCommand字符串初始化,然后才构造SqlDataAdapter对象。

答案 2 :(得分:0)

您的CommandText通过Value传递给SqlDataAdapter,而不是通过引用传递,因此在创建适配器后更改变量getCommand不会影响数据适配器。一个非常简单的演示就是:

static void Main(string[] args)
{
    string r = "Test";
    using (var adapter = new SqlDataAdapter(r, new SqlConnection("")))
    {
        r = "Test2";
        Console.WriteLine(adapter.SelectCommand.CommandText);
    }

}

输出

  

测试

  

的Test2

您需要明确更改适配器的SelectCommand.CommandText:

holdone.SelectCommand.CommandText = getCommand;

如果值得重复使用这样的对象是没有用的,它甚至几乎不会保存代码。 .NET使用连接池,因此使用多个SQL连接/适配器并不一定意味着数据库有多个管道。您还应该使用parameterised queries

string sql = "select *redacted* from " + tableref + " where *redacted* = @InvoiceParam";
using (var adapter = new SqlDataAdapter(sql, DBConnection.DBConnection.connectionString))
{
    adapter.SelectCommand.Parameters.AddWithValue("@InvoiceParam", invRef);
    adapter.Fill(holdall);
    invoiceTable = holdall.Tables[0];
}