这是一段显示异常的代码。它需要在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;
}
}
答案 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
会阻止,直到用户关闭表单,或者您在点击事件中有一个调用Close
或Hide
的按钮。
根据您提供的稀疏信息,我假设您已经打开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会引发您看到的异常。