[C#.NET sqlDatabase CommandBuilder和DataAdapter:名称'Adapter'在当前上下文中不存在

问题描述 投票:0回答:1

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

我将CommandBuilder与Adapter1一起使用来更新,保存,删除或向数据库中插入新记录。

我遇到的问题是,我声明的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]);
}
c# sql-server sqldataadapter sqlcommandbuilder
1个回答
0
投票

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

总的来说,这是作为练习来进行的工作,但是请注意,DataAdapter和DataSet是.NET的非常老的部分,并且这种习语在现代数据层中使用不多。人们要么使用ORM(例如EntityFramework),要么如果他们想要控制和效率,则直接使用ADO.NET命令。我还要指出,您正在构建的类似乎正在尝试充当DataAdapter的角色,因此在现实生活中它没有任何实用程序(人们只会直接使用SqlDataAdapter而不是您的类) 。

© www.soinside.com 2019 - 2024. All rights reserved.