向数据表中添加记录时的两个问题.

ltolll 2005-05-30 12:24:45
我的代码:
...
SqlDataAdapter sqlDataAda = new SqlDataAdapter("select * from CustomerInfo",sqlCon);
DataSet sqlDS = new DataSet();
sqlDataAda.Fill(sqlDS,0,0,"CustomerInfo");
DataTable sqlTable = new DataTable("CustomerInfo");
sqlTable= sqlDS.Tables[0];
DataRow sqlRow = sqlTable.NewRow();
sqlRow["Id"] = labCusId.Text;
sqlRow["Name"] = txtName.Text;
sqlRow["Weight"] = txtWeight.Text;
sqlTable.Rows.Add(sqlRow);
sqlDataAda.Update(sqlDS,"CustomerInfo");

这里有两个问题:
1.我在添加记录时不想用Insert语句来做,而想用上面的Rows.Add()方法,但是这样之前连接数据表时却要用到:"select * from CustomerInfo"的查询,这样把整个表的数据都查出来实在是太不经济了,能不能想个别的办法,仍然保证用Rows.Add()方法添加数据.
2.SQL数据库中字段["Weight"] 是int型的,可为空,程序运行时txtWeight.Text什么都不添,添加记录时就报错了,我想让这个字段添不添都可以,怎么解决?
...全文
125 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ltolll 2005-06-03
  • 打赏
  • 举报
回复
明白了,谢谢.
ltolll 2005-06-01
  • 打赏
  • 举报
回复
To:willsun() ...楼主却没有调用这个SqlCommandBuilder !!
厉害,不用SqlCommandBuilder是通不过的,代码其实是这样:
SqlDataAdapter sqlDataAda = new SqlDataAdapter(selCus,sqlCon);
SqlCommandBuilder sqlCB = new SqlCommandBuilder(sqlDataAda);//应该是这行吧
DataSet sqlDS = new DataSet();
...

您前面说的:"...这样的方法进行更新,而不用insert,如果是的话,那么必须设置SqlDataAdapter.InsertCommand属性,这样调用SqlDataAdapter.Update()时可以达到要求(不用select 语句)。"
具体怎样操作?
willsun 2005-06-01
  • 打赏
  • 举报
回复
示例代码如下:
SqlCommand cmd;
cmd = new SqlCommand("INSERT INTO Customers (CustomerID, CompanyName) " +
"VALUES (@CustomerID, @CompanyName)", conn);

cmd.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");
cmd.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName");
da.InsertCommand = cmd;
如果你有删除记录和修改记录的行为,还要像这样设置DeleteCommand ,UpdateCommand 属性,
说到底还是要包含INSERT INTO语句,即使用SqlCommandBuilder也是自动产生这个语句。
willsun 2005-05-31
  • 打赏
  • 举报
回复
呵呵,楼主是不是想用
sqlTable= sqlDS.Tables[0];
DataRow sqlRow = sqlTable.NewRow();
sqlRow["Id"] = labCusId.Text;
sqlRow["Name"] = txtName.Text;
sqlRow["Weight"] = txtWeight.Text;
sqlTable.Rows.Add(sqlRow);
sqlDataAda.Update(sqlDS,"CustomerInfo");
这样的方法进行更新,而不用insert,如果是的话,那么必须设置SqlDataAdapter.InsertCommand属性,这样调用SqlDataAdapter.Update()时可以达到要求(不用select 语句)。
但是我怀疑你的代码能够正常工作,因为你调用Update时,没有设置此属性,还可以通过如下方法设置此属性,就是必须有select 语句的情况下,调用SqlCommandBuilder ,可以自动生成 InsertCommand,楼主却没有调用这个SqlCommandBuilder !!
ltolll 2005-05-31
  • 打赏
  • 举报
回复
To:louzu1(坦克兵)
1、select 改一下啦,给个不可能的条件,查一条空纪录;
可是这样的SQL语句是不是一样要遍历所有记录呢,而且对每条记录都要做一次判断啊.
第二个问题解决了,谢.

To:hjf1223(学点有技术含量的!)
这些数据控件都是用拖拉进来的吗?
不是,是手工代码产生的.

To: zhzuo(秋枫)
看来楼主...
hehe,我帮你说了吧,看来楼主很菜鸟是不是,这个么...我本来是学化学的,单位里有点程序要做就临时学一下(以前用VB做个工资的小东西),刚开始学C#,上面的代码是七拼八揍得来的,有的代码并不知道细节上是为什么那么写.请问向数据表中添加数据最好的方法是什么?
louzu1 2005-05-30
  • 打赏
  • 举报
回复
1、select 改一下啦,给个不可能的条件,查一条空纪录;
2、给sqlRow["Weight"]值前现判断一下txtWeight,如果没有值就不执行sqlRow["Weight"]这句。
itmingong 2005-05-30
  • 打赏
  • 举报
回复
学习
marvelstack 2005-05-30
  • 打赏
  • 举报
回复
看来楼主...
DataTable sqlTable = new DataTable("CustomerInfo");
sqlTable= sqlDS.Tables[0];
//为什么要无为的浪费内存?
我在添加记录时不想用Insert语句来做,而想用上面的Rows.Add()方法,
Insert语句是DataAdapter.InsertCommand来执行的Sql语句,用于把内存数据集中的数据更新到数据源,
而Rows.Add()方法只是在内存DataTable中增加一行,对数据源没有联系呀。
如果字段["Weight"]可以为空,你可以判断值txtWeight.Text,
可以使用DBNull.Value
hjf1223 2005-05-30
  • 打赏
  • 举报
回复
这些数据控件都是用拖拉进来的吗?用DataAdapter的Update方法来添加数据其实不用先从数据库读数据下来的。你只需在本地中创建一个DataTable的结构,这个结构可以跟数据库中对应该的表结构一样,也可以不一样,这些都没有关系。这个表与数据库中表的字段的对应是对参数来指定的。因为你上面的都是用拖拉控件的方式,所以它已经帮你把插入和更新,修改代码都写好了,你是一定要根据它的Sql参数来传的。具体DataAdapter的Update方法的使用可以去看一下MSDN.具体你可以看一下你DataAdapter的属性就知道了
你可以把Fill()这步换成创建表的过程.比如这样。
private DataTable BuildTable()
{
DataTable m_dt = new DataTable();
DataColumn m_dc = new DataColumn("Weight",typeof("System.String"));
m_dt.Columns.Add(m_dc);
}

110,535

社区成员

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

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

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