executereader commandtext属性尚未初始化c#

时间:2014-07-03 20:13:52

标签: c# sql .net

这是一段显示异常的代码。它需要在Window窗体(testform)上的文本框中输入文本查询,并在excel表中显示结果。我怎么能在字符串中取值,以便它不显示异常,并且sql1是文本框名称是Testform.cs中的空函数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.IO;
using System.Windows.Forms;
using Exceloutput_Application;

public class ProcessDataset
{
    public ProcessDataset()
    {

    }

    public static DataTable ReadTable()
    {
        TestForm t = new TestForm();
        var returnValue = new DataTable();
        var conn = new SqlConnection(ConnectionString._connectionString);
        string st = t.sql1.Text;

        try
        {
            conn.Open();
            var command = new SqlCommand(st, conn);
            using (var adapter = new SqlDataAdapter(command))
            {
                adapter.Fill(returnValue);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            throw ex;
        }
        finally
        {
            if (conn.State == ConnectionState.Open)
                conn.Close();
        }
        return returnValue;
    }
}

1 个答案:

答案 0 :(得分:0)

您要么假设实例化(新)Form会神奇地显示它,要么获取对现有开放表单的引用。这些假设都不属实。

要向用户显示表单,您可以为您的第一个表单(应用程序的主要表单)调用Application.Run,或在您创建的实例上调用Show ShowDialog

让我在ReadTable方法的前几行添加评论:

TestForm t = new TestForm(); // this ONLY creates a NEW form in memory
// if you were looking at a TestForm already t holds a new form
// and not the one you're looking at.
var returnValue = new DataTable();
var conn = new SqlConnection(ConnectionString._connectionString);
// the form is not shown to the user at this point
// and never will be because YOU didn't tell it to Show
// The textbox is empty
string st = t.sql1.Text;
// st will be an empty string here

通过这个解释,让我们看看可能的解决方案。您可能想要添加

t.Show(); 
创建TestForm后直接

。这确实显示了表单,但Show是非阻塞的。这意味着它会立即继续,其余的代码仍导致st中的空结果。

t.ShowDialog();

将使您能够查看表单并填写任何值。 ShowDialog会阻止,直到用户关闭表单,或者您在点击事件中有一个调用CloseHide的按钮。

根据您提供的稀疏信息,我假设您已经打开TestForm,其上有一个调用ReadTable的按钮。如果您更改ReadTable以接受sql字符串,则不必同时处理表单。 这样的事情会做:

public class ProcessDataset
{
    // Takes a Sql string
    public static DataTable ReadTable(string sql)
    {
       var returnValue = new DataTable();
       // checks if there is a sql string provided
       if (!String.IsNullOrEmpty(sql)) 
       {

            var conn = new SqlConnection(ConnectionString._connectionString);
            conn.Open();
            var command = new SqlCommand(sql, conn);
            // rest of code
       }
       else 
       {
           // show message to user
           MessageBox.Show(" no sql command ");
       }
       return returnValue;
    }
 }

您将从您的点击事件中调用它,如下所示:

private  void button2_Click(object sender, EventArgs e) 
{
    var resultset = ProcessDataset.ReadTable(sql1.Text);
}

tl; dr 您的SqlCommand代码没有太大问题。您只是无法获得包含某些sql语句的Textbox的正确引用。使用空字符串调用sqlcommand会引发您看到的异常。