C# 如何将DataTable一次写入数据库 public void UpdateDataTable(DataTable DT)
        {
            SqlConnection Con = GetConnection();
            string strSQL = "select * from orderitems" ;
            if (Con.State == ConnectionState.Closed)
            {
                Con.Open();
            }
            try
            {
                SqlCommand Cmd = new SqlCommand(strSQL, Con);
                SqlDataAdapter Dad = new SqlDataAdapter(Cmd);
                Dad.Update(DT);
               
                Con.Close();
                
            }
            catch (SqlException ex)
            {
                throw ex;
            }
        }执行程序后数据并没有插入数据库,请帮忙看看代码该如何修改

解决方案 »

  1.   

    string strSQL = "select * from orderitems" ; 是查询代码,怎么会“插入数据库”
      

  2.   

    使用SqlDataAdapter 还要创建一个SqlCommandBuilder
      

  3.   

    To Sqllong:
         我是要把内存中的DataTable直接插入到表OrderItems中,请问该如何写呢?
      

  4.   

    内存中的DataTable 结构和表OrderItems一样么?
      

  5.   

    To Sqllong :
              内存中的DataTable 结构和表OrderItems结构是一样的!
      

  6.   

    当调用DataAdapter.Update(DataTable)方法时,DataTable.Rows集合中,那些被标记为Deleted的DataRow所对应的记录将从数据库中被删除,被标记为Modified的DataRow所对应的记录将在数据库中被更新,而被标记为Added的DataRow将添加到数据库中,所以对于你的情况,原因就是需要添加到数据库中的DataRow没有被标记为Added。那么如何使这些记录被标记为Added?有两种方法。
    1 调用DataTable.Rows.Add(DataRow r)方法,r将被系统自动标记为Added;
    2 对DataTable.Rows集合中的DataRow r调用 SetAdded方法。
      

  7.   

     To idot:
                 
                     DataRow Row = DT.NewRow();
                       Row.SetAdded();
                        DT.Rows.Add(Row );
                   这样写会报错,请问该在哪里设定 SetAdded()呢?
      

  8.   

    你的写法不正确,有两种写法:
    1 DataRow Row = DT.NewRow(); 
     Row.ID = idvalue;// 一定要为所有不允许为NULL的field赋一个值
     //赋值结束
     DT.Rows.Add(Row);2 foreach(DataRow row in DT.Rows){
          if(row.RowState != DataRowState.Added){
              row.SetAdded();
          }
      }
    建议你用第一种方法,第二种方法是手动处理,在特殊情况下才比较合适。
     
      

  9.   

    参考遍历插入
     public void InsertTable(DataTable table1)
        {              string strInsert = "insert into Number values (@value)";
            SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["connStr"]);
            conn.Open();
            SqlCommand com = new SqlCommand(strInsert, conn);
            SqlParameter p1 = new SqlParameter("@value", SqlDbType.VarChar);
            com.Parameters.Add(p1);
            for (int i = 0; i < table1.Rows.Count; i++)
            {
                DataRow row = table1.Rows[i];
                p1.Value = row[1].ToString();
                com.ExecuteNonQuery();
            }
            conn.Close();    }
      

  10.   

    To Idot:
              请帮忙看看这些代码,DataTable仍不能插入数据库
                       DataTable插入行:                  
                       DataRow Row = DT.NewRow(); 
                       Row["Input_Time"]='2004';
                       Row["Location_ID"]='dfd0';
                       ///Row.SetAdded(); 
                      //////////////////////////////需要设定Row 的什么属性呢,Row.ID这个好像是没有的
                       DT.Rows.Add(Row );                    写入数据库
                           strSQL="select * from tblName";
                            SqlCommand Cmd = new SqlCommand(strSQL, Con);
                    SqlDataAdapter Dad = new SqlDataAdapter();
                    Dad.InsertCommand = Cmd;
                    SqlCommandBuilder Builder = new SqlCommandBuilder(Dad);
                    Dad.Update(DT);
      

  11.   

    你的SQL语句不正确。
    DataAdapter只是一个适配器,它必须有相应的SqlCommand来为其工作,并且有什么样的SqlCommand就执行什么样的工作。
    DataAdapter.SelectCommand用于获取数据,因此它的CommandText应该是select语句;
    DataAdapter.InsertCommand用于插入数据,因此它的CommandText应该是insert语句;
    DataAdapter.DeleteCommand用于删除数据,因此它的CommandText应该是delete语句;
    DataAdapter.UpdateCommand用于更新数据,因此它的CommandText应该是update语句;因此你的代码应该这样写:
    SelectSQL="select * from tblName"; 
    SqlCommand SelectCmd = new SqlCommand(SelectSQL, Con); InsertSQL="insert into tblName (Input_Time,Location_ID) values (@Input_Time,@Location_ID)"; 
    SqlCommand InsertCmd = new SqlCommand(InsertSQL, Con); 
    InsertCmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Input_Time",System.Data.SqlDbType.Time));
    InsertCmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@Location_ID",System.Data.SqlDbType.NVarChar));SqlDataAdapter Dad = new SqlDataAdapter(); 
    Dad.SelectCommand = SelectCmd; 
    Dad.InsertCommand = InsertCmd; 
    Dad.Update(DT); 
      

  12.   

    要将整张DataTable中的所有数据全部插入一个数据表中,要么就要指定好插入的sql语句,要么就使用sqlcommandbuilder。使用sqlcommandbuilder有一个好处,就是你只要指定查询语句就可以了,它会自动帮你生成更新,删除,插入语句。也有一个坏处,就是这个datatable必须只针对一张表。直接指定sql语句的话就很灵活了,
    随便多少表,只要你的sql能插入成功就行。