繁体   English   中英

SqlDataAdapter.Fill无效的对象名称SQL

[英]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语句,您可能最终没有处置应处置的实例。

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; 

PS这里是我要遵循的教程: http : //csharp.net-informations.com/datagridview/csharp-datagridview-database-operations.htm

这是您应该遵循的教程集:

https://msdn.microsoft.com/zh-CN/library/fxsa23t6.aspx

从“创建简单的数据应用程序”开始

为什么我提倡这些,而不是您在网络上找到的其他方法? 并非详尽的原因清单:

  • 您正在使用的编程语言的创建者,将其创建为使用数据集的最佳实践模型
  • 他们适当地抽象(隐藏)了围绕数据库交互的许多细节,除非您需要做到低调而肮脏
  • 它将清理您的代码没有尽头
  • 它们安全,快速且功能强大; 您会自动远离大规模安全性,就像SQL注入一样
  • 它们是您现在正在做的事情的主要步骤。 您不会通过手工编写用于放置和设置每个组件属性的语句来布局Windows窗体:您使用的视觉设计器可提供丰富而专业的编辑体验并生成高质量的代码。 没什么两样

如果您采用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM