我的代码:
...
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什么都不添,添加记录时就报错了,我想让这个字段添不添都可以,怎么解决?

解决方案 »

  1.   

    1、select 改一下啦,给个不可能的条件,查一条空纪录;
    2、给sqlRow["Weight"]值前现判断一下txtWeight,如果没有值就不执行sqlRow["Weight"]这句。
      

  2.   

    这些数据控件都是用拖拉进来的吗?用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);
    }
      

  3.   

    看来楼主...
    DataTable sqlTable = new DataTable("CustomerInfo");
    sqlTable= sqlDS.Tables[0];
    //为什么要无为的浪费内存?
    我在添加记录时不想用Insert语句来做,而想用上面的Rows.Add()方法,
    Insert语句是DataAdapter.InsertCommand来执行的Sql语句,用于把内存数据集中的数据更新到数据源,
    而Rows.Add()方法只是在内存DataTable中增加一行,对数据源没有联系呀。
    如果字段["Weight"]可以为空,你可以判断值txtWeight.Text,
    可以使用DBNull.Value
      

  4.   

    To:louzu1(坦克兵) 
    1、select 改一下啦,给个不可能的条件,查一条空纪录;
    可是这样的SQL语句是不是一样要遍历所有记录呢,而且对每条记录都要做一次判断啊.
    第二个问题解决了,谢.To:hjf1223(学点有技术含量的!) 
    这些数据控件都是用拖拉进来的吗?
    不是,是手工代码产生的.To: zhzuo(秋枫) 
    看来楼主...
    hehe,我帮你说了吧,看来楼主很菜鸟是不是,这个么...我本来是学化学的,单位里有点程序要做就临时学一下(以前用VB做个工资的小东西),刚开始学C#,上面的代码是七拼八揍得来的,有的代码并不知道细节上是为什么那么写.请问向数据表中添加数据最好的方法是什么?
      

  5.   

    呵呵,楼主是不是想用
               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 !!
      

  6.   

    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 语句)。"
    具体怎样操作?
      

  7.   

    示例代码如下:
    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也是自动产生这个语句。