Select 命令初始化错误
Select Command initialized Error
问题
我已经为此苦苦挣扎了一段时间。虽然我认为我已经初始化了 select 命令,但我有以下错误?
The dataadapter.selectcommand.connection property needs to be initialized
我知道我不会因为没有设置主键而收到此错误,正如我所读,这可能是问题所在。我肯定有主键。
背景
此函数select是使用 if 语句调用的查询。在查询中有参数化变量,这些变量根据最终用户 select 在两个组合框中 select 编辑。
SQLSelection();
示例查询
SQL = "SELECT * FROM dbo.joblist_TEST WHERE username = @username and status in ('New','Hold')";
不工作的位是Update_Click
事件句柄。
代码
public partial class Form1 : Form
{
int weeks = 0;
SqlCommand command = new SqlCommand();
SqlDataAdapter adb = new SqlDataAdapter();
SqlDataAdapter adapter = new SqlDataAdapter();
SqlCommandBuilder builder = new SqlCommandBuilder();
SqlCommand selectCommand = new SqlCommand();
DataSet ds = new DataSet();
DataTable dt = new DataTable();
SqlConnection con = new SqlConnection();
String ConnString = "Data Source=sqlexpress; Initial Catalog=MobileData; User ID=mobile; Password=pw";
}
public DataTable getDataTable()
{
//Decide what query
String SQL = SQLSelection();
// SqlDbConnection con = new OleDbConnection(ConnString);
SqlConnection con = new SqlConnection(ConnString);
//open connection to database
con.Open();
//create adapter that sits inbetween dataset and datbase
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(SQL, con);
adapter.UpdateCommand = new SqlCommand(SQL, con);
adapter.SelectCommand.Parameters.Add("@username", SqlDbType.VarChar).Value = auditorCmb.Text;
adapter.SelectCommand.Parameters.Add("@status", SqlDbType.VarChar).Value = statusCmb.Text;
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
adapter.Fill(ds, "jobList_Test");
dt = ds.Tables["jobList_Test"];
dataGridView1.DataSource = ds.Tables["jobList_Test"];
int rowCount = rowCount = dt.Rows.Count;
label10.Text = rowCount.ToString("n0");
return dt;
}
public void Update_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Are you sure you want to save changes?", "Save Changes", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
try
{
adapter.SelectCommand = command; // cmd1 is your SELECT command
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
builder.GetUpdateCommand(); // Force the building of commands
adapter.Update(ds, "jobList_Test");
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
}
问题是你没有设置你刚才设置的select命令是什么
adapter.SelectCommand = 命令; // cmd1 是你的 SELECT 命令,我认为你没有定义什么命令只是新的 sqlCommand...请提供更多关于你想做什么的信息,这样我可以提供更多帮助。
您的这段代码 adapter.SelectCommand = command;
使用的是仅使用 SqlCommand 初始化的 SqlCommand,未指定连接。我看你也做事过头了。提及您想要实现的目标可能有助于获得更好的答案。
您需要大大简化示例代码。我什至没有看到 getDataTable()
在哪里被调用。
无论哪种方式,您都在走一条众所周知的失败之路。 SqlConnection
和 SqlCommand
对象应该 永远不会 被实例化为全局变量。相反,它们应该在调用代码块中创建和处理。
为什么?因为它们实现了 IDisposable 并处理非托管资源。这意味着如果/当您的程序有问题时,您将泄漏内存和数据库连接。
请注意,即使每秒创建和处理数千个 SqlConnection 或 SqlCommand 对象也不会导致性能问题。
最终,您似乎真的把事情复杂化了。
问题
我已经为此苦苦挣扎了一段时间。虽然我认为我已经初始化了 select 命令,但我有以下错误?
The dataadapter.selectcommand.connection property needs to be initialized
我知道我不会因为没有设置主键而收到此错误,正如我所读,这可能是问题所在。我肯定有主键。
背景
此函数select是使用 if 语句调用的查询。在查询中有参数化变量,这些变量根据最终用户 select 在两个组合框中 select 编辑。
SQLSelection();
示例查询
SQL = "SELECT * FROM dbo.joblist_TEST WHERE username = @username and status in ('New','Hold')";
不工作的位是Update_Click
事件句柄。
代码
public partial class Form1 : Form
{
int weeks = 0;
SqlCommand command = new SqlCommand();
SqlDataAdapter adb = new SqlDataAdapter();
SqlDataAdapter adapter = new SqlDataAdapter();
SqlCommandBuilder builder = new SqlCommandBuilder();
SqlCommand selectCommand = new SqlCommand();
DataSet ds = new DataSet();
DataTable dt = new DataTable();
SqlConnection con = new SqlConnection();
String ConnString = "Data Source=sqlexpress; Initial Catalog=MobileData; User ID=mobile; Password=pw";
}
public DataTable getDataTable()
{
//Decide what query
String SQL = SQLSelection();
// SqlDbConnection con = new OleDbConnection(ConnString);
SqlConnection con = new SqlConnection(ConnString);
//open connection to database
con.Open();
//create adapter that sits inbetween dataset and datbase
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(SQL, con);
adapter.UpdateCommand = new SqlCommand(SQL, con);
adapter.SelectCommand.Parameters.Add("@username", SqlDbType.VarChar).Value = auditorCmb.Text;
adapter.SelectCommand.Parameters.Add("@status", SqlDbType.VarChar).Value = statusCmb.Text;
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
adapter.Fill(ds, "jobList_Test");
dt = ds.Tables["jobList_Test"];
dataGridView1.DataSource = ds.Tables["jobList_Test"];
int rowCount = rowCount = dt.Rows.Count;
label10.Text = rowCount.ToString("n0");
return dt;
}
public void Update_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Are you sure you want to save changes?", "Save Changes", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
try
{
adapter.SelectCommand = command; // cmd1 is your SELECT command
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
builder.GetUpdateCommand(); // Force the building of commands
adapter.Update(ds, "jobList_Test");
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
}
问题是你没有设置你刚才设置的select命令是什么 adapter.SelectCommand = 命令; // cmd1 是你的 SELECT 命令,我认为你没有定义什么命令只是新的 sqlCommand...请提供更多关于你想做什么的信息,这样我可以提供更多帮助。
您的这段代码 adapter.SelectCommand = command;
使用的是仅使用 SqlCommand 初始化的 SqlCommand,未指定连接。我看你也做事过头了。提及您想要实现的目标可能有助于获得更好的答案。
您需要大大简化示例代码。我什至没有看到 getDataTable()
在哪里被调用。
无论哪种方式,您都在走一条众所周知的失败之路。 SqlConnection
和 SqlCommand
对象应该 永远不会 被实例化为全局变量。相反,它们应该在调用代码块中创建和处理。
为什么?因为它们实现了 IDisposable 并处理非托管资源。这意味着如果/当您的程序有问题时,您将泄漏内存和数据库连接。
请注意,即使每秒创建和处理数千个 SqlConnection 或 SqlCommand 对象也不会导致性能问题。
最终,您似乎真的把事情复杂化了。