我的数据集有 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 中有三个表:Movies
、Members
和 Category
。电影在 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类型,如何写这条语句