我的代码:
...
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什么都不添,添加记录时就报错了,我想让这个字段添不添都可以,怎么解决?
...
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什么都不添,添加记录时就报错了,我想让这个字段添不添都可以,怎么解决?
2、给sqlRow["Weight"]值前现判断一下txtWeight,如果没有值就不执行sqlRow["Weight"]这句。
你可以把Fill()这步换成创建表的过程.比如这样。
private DataTable BuildTable()
{
DataTable m_dt = new DataTable();
DataColumn m_dc = new DataColumn("Weight",typeof("System.String"));
m_dt.Columns.Add(m_dc);
}
DataTable sqlTable = new DataTable("CustomerInfo");
sqlTable= sqlDS.Tables[0];
//为什么要无为的浪费内存?
我在添加记录时不想用Insert语句来做,而想用上面的Rows.Add()方法,
Insert语句是DataAdapter.InsertCommand来执行的Sql语句,用于把内存数据集中的数据更新到数据源,
而Rows.Add()方法只是在内存DataTable中增加一行,对数据源没有联系呀。
如果字段["Weight"]可以为空,你可以判断值txtWeight.Text,
可以使用DBNull.Value
1、select 改一下啦,给个不可能的条件,查一条空纪录;
可是这样的SQL语句是不是一样要遍历所有记录呢,而且对每条记录都要做一次判断啊.
第二个问题解决了,谢.To:hjf1223(学点有技术含量的!)
这些数据控件都是用拖拉进来的吗?
不是,是手工代码产生的.To: zhzuo(秋枫)
看来楼主...
hehe,我帮你说了吧,看来楼主很菜鸟是不是,这个么...我本来是学化学的,单位里有点程序要做就临时学一下(以前用VB做个工资的小东西),刚开始学C#,上面的代码是七拼八揍得来的,有的代码并不知道细节上是为什么那么写.请问向数据表中添加数据最好的方法是什么?
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 !!
厉害,不用SqlCommandBuilder是通不过的,代码其实是这样:
SqlDataAdapter sqlDataAda = new SqlDataAdapter(selCus,sqlCon);
SqlCommandBuilder sqlCB = new SqlCommandBuilder(sqlDataAda);//应该是这行吧
DataSet sqlDS = new DataSet();
...您前面说的:"...这样的方法进行更新,而不用insert,如果是的话,那么必须设置SqlDataAdapter.InsertCommand属性,这样调用SqlDataAdapter.Update()时可以达到要求(不用select 语句)。"
具体怎样操作?
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也是自动产生这个语句。