我的数据集有 3 个表,当我想用​​ web 表单更新某个表时,它引用了另一个

Posted

技术标签:

【中文标题】我的数据集有 3 个表,当我想用​​ web 表单更新某个表时,它引用了另一个【英文标题】:My dataset has 3 tables, and when I want to update a certain table with a web form, it refers to another 【发布时间】:2016-07-06 21:34:57 【问题描述】:

这是我的代码:

public partial class AddMovieForm : System.Web.UI.Page

    const string connStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\user\Documents\MovieTimeDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
    SqlDataAdapter adapter;
    DataSet ds;
    DataSet genreDS;
    protected void Page_Load(object sender, EventArgs e)
    
        string name = Request.Form["name"];
        string producer = Request.Form["producer"];
        string summary = Request.Form["summary"];
        string genre = Request.Form["genre"];

        int year = int.Parse(Request.Form["year"]);
        int length = int.Parse(Request.Form["length"]);

        string sqlStr = "SELECT * FROM Movies";

        ds = GetDataSet(sqlStr);

        string genreSqlString = "SELECT * FROM Genres WHERE genre='"+genre1+"'";

        genreDS = GetDataSet(genreSqlString);
        DataRow GenreDR = genreDS.Tables[0].Rows[0];

        int genre2 = (int)GenreDR["id"];

        Insert(name, producer, summary, genre2, year,length);
        Response.Redirect("Main.aspx");
    

    protected void Insert(string name, string producer, string summary, int genre, int year, int length)
    
        DataRow dr = ds.Tables[0].NewRow();
        dr["name"] = name;
        dr["producer"] = producer;
        dr["summary"] = summary;
        dr["genre"] = genre;
        dr["year"] = year;
        dr["length"] = length;
        ds.Tables[0].Rows.Add(dr);

        SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
        adapter.InsertCommand = builder.GetInsertCommand();
        adapter.Update(ds);
    

    public DataSet GetDataSet(string strSql)
    
        DataSet ds = new DataSet();

        SqlConnection conn = new SqlConnection(connStr);
        adapter = new SqlDataAdapter(strSql, conn);

        conn.Open();

        adapter.Fill(ds);

        conn.Close();

        return ds;
    

我在 ds 中有三个表:MoviesMembersCategory。电影在 ds 中,但是当我运行代码时,adapter.Update(ds); 行引起了麻烦:

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

异常详细信息:System.InvalidOperationException:缺少 SourceColumn 'id' 的 DataTable 'Table' 中的 DataColumn 'id'。

问题是我只有在表Category 中有一个id 列,当我用表Movies 填充我的ds 时,我不明白为什么它引用了该表。

【问题讨论】:

这部分代码string genreSqlString = "SELECT * FROM Genres WHERE genre='"+genre1+"'"; 非常危险,您将自己暴露在SQL 注入攻击之下。你最好使用像实体框架这样的 ORM,或者如果它太笨重,试试 Dapper。 【参考方案1】:

当对多个表使用单个适配器时,在每次更新之间必须重置commandtext和SqlCommandBuilder,否则仍然引用前一个。例如,最初在 table1 上使用了适配器。更新table2的代码是:

adapter.SelectCommand.CommandText = "Select * From table2"
builder = New SqlCommandBuilder(adapter)
adapter.Update(ds, "table2")

大多数其他帖子都指定您必须为每个表使用单独的适配器,但我认为没有必要。

【讨论】:

以上是关于我的数据集有 3 个表,当我想用​​ web 表单更新某个表时,它引用了另一个的主要内容,如果未能解决你的问题,请参考以下文章

现有个表,名称是test,里面的字段是id,int类型,我想用sql语句把这个字段改为unsigned类型,如何写这条语句

(PL/)SQL 查看超过 3 个表,用户名和密码

我想用 postgresql 开发一个 adf fusion web 应用程序项目

基于codeigniter中2个表的id显示数据

登录表单,如何在一个登录表单中使用 3 个表登录?

将数据保存到 2 个表中 cakephp 3