[英]SqlDataAdapter.Fill Invalid object name SQL
我正在尝试将数据从sql数据库表加载到datagridview中。
我得到以下内容:
System.Data.dll中发生了类型为'System.Data.SqlClient.SqlException'的未处理异常。其他信息:无效的对象名称'JournalItems'。
调用时:
SqlDataAdapter.Fill(<dataset here>, <datatable name here>)
我知道JournalItems是我数据库中的有效数据表。 我也尝试使用“ MyInitialCatalog.dbo.JournalItems”和“ MyInitialCatalog.JournalItems”没有成功。
这是我的代码:
private void loadData_Click(object sender, EventArgs e)
{
string connectionString = "Data Source=myDataSource;Initial Catalog=MyInitialCatalog;Persist Security Info=True;User ID=myID;Password=myPassword";
string sql = "SELECT * FROM JournalItems";
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
sCommand = new SqlCommand(sql, connection);
sAdapter = new SqlDataAdapter(sCommand);
sBuilder = new SqlCommandBuilder(sAdapter);
sDs = new DataSet();
JournalItems = new DataTable();
sAdapter.Fill(sDs, "JournalItems");
sTable = sDs.Tables["JournalItems"];
connection.Close();
journalItemsDataGridView.DataSource = sDs.Tables["JournalItems"];
journalItemsDataGridView.ReadOnly = true;
saveData.Enabled = false;
journalItemsDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
}
PS:这是我要遵循的教程: http : //csharp.net-informations.com/datagridview/csharp-datagridview-database-operations.htm
您的数据集没有名为
"JournalItems"
表。
代替
JournalItems = new DataTable();
在数据集中创建表:
sDs.Tables.Add("JournalItems");
好吧,事实证明我的最初答案是错误的。 如果数据集没有具有指定名称的表,则dataAdapter应该创建它。
您需要确保已连接到正确的数据库和正确的架构。 尝试在查询本身中添加数据库名称和架构名称:
string connectionString = "Data Source=myDataSource;Initial Catalog=MyInitialCatalog;Persist Security Info=True;User ID=myID;Password=myPassword";
string sql = "SELECT * FROM JournalItems";
sDs = new DataSet();
sDs.Tables.Add("JournalItems");
using(var connection = new SqlConnection(connectionString))
{
using(var sCommand = new SqlCommand(sql, connection))
{
using(var sAdapter = new SqlDataAdapter(sCommand))
{
sAdapter.Fill(sDs, "JournalItems");
}
}
}
journalItemsDataGridView.DataSource = sDs.Tables["JournalItems"];
journalItemsDataGridView.ReadOnly = true;
saveData.Enabled = false;
journalItemsDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
我的原始答案的其余部分仍然是正确的-仅在访问了您正在使用的教程的链接之后,我才需要补充一点,您应该避免使用类级变量来保存实现IDisposable
接口的实例-因为那样您不能使用using
语句,您可能最终没有处置应处置的实例。
SqlConnection
, SqlCommand
, SqlDataAdapter
和SqlCommandBuilder
都实现IDisposable
接口,因此您实际上应该在using
语句内使用它们。 顺便说一句,您不需要此代码的SqlCommandBuilder
。
您的代码应如下所示:
string connectionString = "Data Source=myDataSource;Initial Catalog=MyInitialCatalog;Persist Security Info=True;User ID=myID;Password=myPassword"; string sql = "SELECT * FROM JournalItems"; sDs = new DataSet(); sDs.Tables.Add("JournalItems"); using(var connection = new SqlConnection(connectionString)) { using(var sCommand = new SqlCommand(sql, connection)) { using(var sAdapter = new SqlDataAdapter(sCommand)) { sAdapter.Fill(sDs, "JournalItems"); } } } journalItemsDataGridView.DataSource = sDs.Tables["JournalItems"]; journalItemsDataGridView.ReadOnly = true; saveData.Enabled = false; journalItemsDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
PS这里是我要遵循的教程: http : //csharp.net-informations.com/datagridview/csharp-datagridview-database-operations.htm
这是您应该遵循的教程集:
https://msdn.microsoft.com/zh-CN/library/fxsa23t6.aspx
从“创建简单的数据应用程序”开始
为什么我提倡这些,而不是您在网络上找到的其他方法? 并非详尽的原因清单:
如果您采用Microsoft建议您进行数据访问的方式,则您的代码将看起来像这样:
MyTypedDataSet ds = new MyTypedDataSet();
MyTypedTableAdapter ta = new MyTypedTableAdapter();
ta.Fill(ds, "my where clause parameter value");
myGridview.DataSource = ds.MyTypedTable;
或者,至少:
myGridview.DataSource = new MyTypedTableAdapter().GetXXX();
没有连接字符串,没有充满狡猾SQL的按钮单击处理程序; 可重用,可维护,易于阅读的代码,无需花费100行就能推动数据库连接的细节
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.