C#.NET sqlDatabase CommandBuilder 和 DataAdapter:名称“适配器”在当前上下文中不存在

Posted

技术标签:

【中文标题】C#.NET sqlDatabase CommandBuilder 和 DataAdapter:名称“适配器”在当前上下文中不存在【英文标题】:C#.NET sqlDatabase CommandBuilder and DataAdapter: The name 'Adapter' does not exit in the current context 【发布时间】:2020-04-14 23:33:19 【问题描述】:

我一直在线关注 C# .Net 教程。创建了一个class 并为我的DataAdapter 声明了变量Adapter1

我正在使用带有 Adapter1 的 CommandBuilder 来更新、保存、删除或向数据库插入新记录。

我遇到的问题是我声明的UpdateDatabase 方法似乎看不到变量Adapter1

请查看下面的代码并告诉我我做错了什么。导致错误的代码位于最底部

private string sql_string;
private string strCon; //This is a write-only property

public string Sql

    set  sql_string = value; 


public string connection_string

    set  strCon = value; 


public System.Data.DataSet GetConnection

    get  return MyDataSet(); 


private System.Data.DataSet MyDataSet()

    System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(strCon);
    con.Open();

    System.Data.SqlClient.SqlDataAdapter Adapter1 = new System.Data.SqlClient.SqlDataAdapter(sql_string, con);

    System.Data.DataSet dat_set = new System.Data.DataSet();
    Adapter1.Fill(dat_set, "Table_Data_1");

    con.Close();

    return dat_set;


public void UpdateDatabase (System.Data.DataSet ds)

    System.Data.SqlClient.SqlCommandBuilder cb = new System.Data.SqlClient.SqlCommandBuilder(Adapter1);
    cb.DataAdapter.Update(ds.Tables[0]);

【问题讨论】:

不要将数据提供者对象包装在“帮助”类中。而是专注于有效和正确地使用它们,其中包括参数化查询、利用连接池和处理所有应该做的事情。 问题是你在MyDataSet方法的范围内声明了Adapter1。在UpdateDatabase方法中你使用Adapter1,但是在这个方法的范围内是无法访问的。 这是正确的。我将此声明移到大括号之外,现在一切都很好。感谢您的反馈。 【参考方案1】:

您收到此特定错误的原因是函数UpdateDatabase() 的范围内没有名为Adapter1 的变量。您可以将您在函数MyDataSet() 中声明的局部变量设为成员变量,然后它将在UpdateDatabase() 中可见。然而,这不是最好的方法,因为您将指望使用此帮助程序类的代码始终在 UpdateDatabase() 函数之前调用 MyDataSet() 函数,否则数据适配器将不会被初始化(您将得到一个空引用错误)。如果你想以这种方式构造代码,你应该在你正在构建的类的构造函数中初始化你的适配器,这样使用你的库的代码可以确保适配器总是被正确初始化。如果以这种方式构建代码,则可以将连接字符串作为构造函数参数而不是只写属性。

无论如何,请继续编写此代码作为练习,但请注意,DataAdapters 和 DataSets 是 .NET 的一个非常古老的部分,并且这个习惯用法在现代数据层中使用得不多。人们要么使用 ORM(如 EntityFramework),要么直接使用 ADO.NET 命令,如果他们想要控制和效率。我还要指出,您正在构建的课程似乎正在尝试扮演 DataAdapter 的角色,因此它在现实生活中没有任何实用性(人们只会直接使用 SqlDataAdapter 而不是您的课程) .

【讨论】:

以上是关于C#.NET sqlDatabase CommandBuilder 和 DataAdapter:名称“适配器”在当前上下文中不存在的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Stringbuilder将多个Listview Item插入sqldatabase?

我有值我想在 SqlDatabase 的表中执行它,我使用存储过程,参数 [重复]

如何将Excel文件保存到C#的特定位置?

Cakephp:使用一个comman字段将多条记录添加到单个模型

sql 使用T-SQL将一串comman分隔的int分成Ints表

powershell 清理和交叉连接包含具有由comman或换行符分隔的多个条目的单元格的excel表