2017-07-24 170 views
0

我想从一个sql数据库表中加载数据到datagridview。SqlDataAdapter.Fill无效的对象名称SQL

我得到如下:

类型“System.Data.SqlClient.SqlException”未处理的异常出现在system.data.dll其他信息:无效的对象名称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

+0

您可以将JournalItems命名为您的DataTable:JournalItems = new DataTable(“JournalItems”); –

+0

您是否检查过在打开()之后连接状态是否打开?也可以试试sAdapter.Fill(sDs); –

+0

嘿,我没有检查连接的状态,它是开放的。当使用sAdapter.Fill(sDs)时,它仍然给我完全相同的错误; –

回答

0

PS这里是我试图按照教程:http://csharp.net-informations.com/datagridview/csharp-datagridview-database-operations.htm

这里是教程设置你应该如下:

https://msdn.microsoft.com/en-us/library/fxsa23t6.aspx

以“创建简单数据应用程序”开头

为什么我会在网上找到其他人呢?原因不是详尽的清单:

  • 您所使用的编程语言的创造者,创造了他们的最佳实践模型与数据集时
  • 他们适当的抽象(隐藏)很多周围的细节数据库之间的交互,除非你需要得到那么低的和肮脏的
  • 它会清理你的代码没有结束
  • 他们是安全,快速和高度功能;你会自动避开大规模的安全问题,不需要SQL注入
  • 它们是你现在正在做的事情的进步;您不需要手动编写窗体,编写用于放置和设置每个组件的属性的语句:您使用可提供丰富和专业编辑体验并生成高质量代码的可视化设计器。这是没有什么不同

如果你在船上,微软建议你做你的数据访问的方式,你的代码看起来会有点像这样:

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行来推动数据库连接的极小点

+0

太棒了!在13行代码中,我取代了235,我的程序也做了同样的事情。作为一个没有经验的年轻开发人员,我很惊讶这是多么的无缝。 –

0

DataSet中没有表称为 "JournalItems"

而不是

JournalItems = new DataTable(); 

创建表的数据集内:

sDs.Tables.Add("JournalItems"); 

哦,原来我的最初的回答是错误的。如果数据集没有指定名称的表,那么dataAdapter应该创建它。

您需要确保连接到正确的数据库和正确的模式。尝试在查询本身加入数据库名称和架构名称:

SELECT * FROM DataBaseName.SchemaName.JournalItems 

我原来的答复的其余部分仍然是正确的 - 只是现在,我已经访问过的链接您正在使用的教程中,我需要添加您应该避免使用类级变量来保存实现接口的实例 - 因为那样您就不能使用using语句,并且最终可能不会处理应该处理的实例。

SqlConnectionSqlCommandSqlDataAdapterSqlCommandBuilder全部实现了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; 
+0

To澄清:我不是试图向名为JournalItems的sD添加一个表。 sql数据库有一个名为JournalItems的表,我试图用它填充数据集sDs。这仍然给我和以前一样的错误。 –

+0

感谢您的更新@Zohar Peled。我曾尝试使用“DataBaseName.SchemaName.JournalItems”指定表,如我在原始问题中所述,如下所示:“MyInitialCatalog.dbo.JournalItems”。我的SchemaName可能是错误的,因为我只是假设它的dbo。 –