没搞定,又来了~~~~~~~~~同一张数据表,生成两个datable时出现的问题,不吝赐教~~~~~~~~~~

gandalf11 2017-09-13 04:32:28
数据库中有表:tab1,表中有若干字段,其中有一字段名为SuiJiShu
代码块1:查询符合条件的记录,并在数据集中建立一个表tab1
string Sql = "select * from tab1 where UserID=123456" ;
DataTable tab1= new DataTable();
tab1= selectData(Sql, "tab1"); //返回一个表
//selectData方法功能就是常规的数据集、数据表的生成sda.Fill(ds, dtName); dt= ds.Tables[dtName];


代码块2:查找所有SuiJiShu字段,并在数据集中建立一个表sjsTab

DataTable sjsTab = new DataTable();
string Sql = "select SuiJiShu from tab1"; //查询字符串
sjsTab = selectData(Sql, "sjsTab"); //返回一个表
//selectData方法功能就是常规的数据集、数据表的生成sda.Fill(ds, dtName); dt= ds.Tables[dtName];

代码块3:插入数据到数据库中
bookClass bk = new bookClass();
bk.Name = "asdfasdf";
bk.SuiJiShu = 3156482
bk.UserID = 5
insertData(tab1, bk); //insertData方法功能就是插入实体数据到指定的数据表中。
那么问题来了?
数据表中只会插入SuiJiShu字段的数据,这是为何?但是当我把加粗部分代码:select SuiJiShu from tab1改为select * from tab1时那么数据就会完整的插入?我明明插入的是tab1表(insertData(tab1, bk)),可为何插入语句使用的是数据集中的sjsTab表?
更诡异的是,如果我把代码块2放在代码块1的前面的时候,就能插入成功。
...全文
243 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gandalf11 2017-09-14
  • 打赏
  • 举报
回复
引用 9 楼 sp1234 的回复:
删除全局 GlobalClass.ds = new DataSet(),“少”了才会更准确。
当我跟踪代码的时候,发现一个问题,就是 public static DataTable selectData(string sql, string dtName) { SqlConnection con = connString(); DataTable dt = new DataTable(); try { sda = new SqlDataAdapter(sql, con); sda.Fill(ds, dtName); dt= ds.Tables[dtName]; foreach (DataRow mDr in dt.Rows) //测试是否有生成表和表结构 { foreach (DataColumn mDc in dt.Columns) { Debug.Log(mDc.ColumnName); //Debug.Log(mDr[mDc].ToString()); } } con.Close(); return dt; } catch (Exception e) { throw new Exception(e.Message); } finally { con.Close(); } } -------------------------------- string Sql = "select * from tab1 where UserID=123456" ; DataTable tab1= new DataTable(); tab1= selectData(Sql, "tab1"); 查询到没有符合条件的记录,数据集中并没有生成tab1表,这个怎么弄?
  • 打赏
  • 举报
回复
删除全局 GlobalClass.ds = new DataSet(),“少”了才会更准确。
gandalf11 2017-09-14
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
回完帖子才看到你上面的两个跟帖内容。 你看你的 ds 变量,它来自于哪里?虽然你没有贴出来,但是可以想象它不是方法的局部变量而是全局变量。你可以按照上述的“断点调试”步骤具体调试一下。 比较可靠的设计方式,是将 ds 声明为方法的局部变量。因为输出的 DataTable 是独立的,本来就不存在去考虑什么“全局数据集”的必要性。不应该滥用全局变量声明。
确实申明的是一个全局变量 void Start () { GlobalClass.OpenConn(); //建立一个连接 GlobalClass.ds = new DataSet(); //建立一个数据集 } 行。那我按你的方法试试,只不过为了代码看起来更方便,我把全局变量的字符串去掉了。
gandalf11 2017-09-14
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
[quote=引用 楼主 huangdaxia 的回复:] 数据表中只会插入SuiJiShu字段的数据,这是为何?但是当我把加粗部分代码:select SuiJiShu from tab1改为select * from tab1时那么数据就会完整的插入?
通常将 sql 查询结果转换为 Datatable/DataSet,就是读取查询出来的第一行结果的所有列(Field)来创建 DatColumn 对象的。所以你的 select ..... 这里有几个字段,就会在 DataTable 上看到几个字段。
引用 楼主 huangdaxia 的回复:
我明明插入的是tab1表(insertData(tab1, bk)),可为何插入语句使用的是数据集中的sjsTab表? 更诡异的是,如果我把代码块2放在代码块1的前面的时候,就能插入成功。
你的贴出的代码中其实没有 DataSet,只有两个 DataTable。所以你说“数据集中的 sjsTab表”这个是自相矛盾的。 代码其实不会骗人!所以你可以在 insertTable 语句执行前后进行断点调试,看看 tab1 和 sjsTable 是不是“==”。如果是引用相同的对象,那么你的 selectData 方法内部就有严重问题了。[/quote] 在脚本其他地方,我有申明 OpenConn(); //建立一个连接 DataSet ds = new DataSet(); //建立一个数据集
  • 打赏
  • 举报
回复
回完帖子才看到你上面的两个跟帖内容。 你看你的 ds 变量,它来自于哪里?虽然你没有贴出来,但是可以想象它不是方法的局部变量而是全局变量。你可以按照上述的“断点调试”步骤具体调试一下。 比较可靠的设计方式,是将 ds 声明为方法的局部变量。因为输出的 DataTable 是独立的,本来就不存在去考虑什么“全局数据集”的必要性。不应该滥用全局变量声明。
  • 打赏
  • 举报
回复
引用 楼主 huangdaxia 的回复:
数据表中只会插入SuiJiShu字段的数据,这是为何?但是当我把加粗部分代码:select SuiJiShu from tab1改为select * from tab1时那么数据就会完整的插入?
通常将 sql 查询结果转换为 Datatable/DataSet,就是读取查询出来的第一行结果的所有列(Field)来创建 DatColumn 对象的。所以你的 select ..... 这里有几个字段,就会在 DataTable 上看到几个字段。
引用 楼主 huangdaxia 的回复:
我明明插入的是tab1表(insertData(tab1, bk)),可为何插入语句使用的是数据集中的sjsTab表? 更诡异的是,如果我把代码块2放在代码块1的前面的时候,就能插入成功。
你的贴出的代码中其实没有 DataSet,只有两个 DataTable。所以你说“数据集中的 sjsTab表”这个是自相矛盾的。 代码其实不会骗人!所以你可以在 insertTable 语句执行前后进行断点调试,看看 tab1 和 sjsTable 是不是“==”。如果是引用相同的对象,那么你的 selectData 方法内部就有严重问题了。
gandalf11 2017-09-14
  • 打赏
  • 举报
回复
贴出查询、填充代码 public static DataTable selectData(string sql, string dtName) { SqlConnection con = connString(); DataTable dt = new DataTable(); try { sda = new SqlDataAdapter(sql, con); sda.Fill(ds, dtName); dt= ds.Tables[dtName]; con.Close(); return dt; } catch (Exception e) { throw new Exception(e.Message); } finally { con.Close(); } }
gandalf11 2017-09-14
  • 打赏
  • 举报
回复
贴出插入代码 public static string insertData<T>(DataTable dt, T objEntity) { string b = "失败"; try { DataRow newRow = dt.NewRow();//声明 Type type = typeof(T); foreach (PropertyInfo prop in type.GetProperties()) { if (newRow.Table.Columns.Contains(prop.Name)) { newRow[prop.Name] = Convert.ToString(prop.GetValue(objEntity, null)).Replace("'", "''"); } } dt.Rows.InsertAt(newRow, 0); DataRow[] ro = new DataRow[] { newRow }; SqlCommandBuilder cmd = new SqlCommandBuilder(sda); sda.Update(ro); b = "成功"; } catch (Exception ex) { b = ex.Message; } return b; }
gandalf11 2017-09-14
  • 打赏
  • 举报
回复
问题解决,送分!谢谢朋友们帮助。 问题出在:sda = new SqlDataAdapter(sql, con);中的sql为最后一个调用的sql语句。SqlDataAdapter有自己一套运行机制,所以,它会以传进去的sql语句去处理。
Alxeven 2017-09-13
  • 打赏
  • 举报
回复
你只给部分代码,也看不出来什么毛病
gandalf11 2017-09-13
  • 打赏
  • 举报
回复
自顶一下。 :)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧