conn.Open();
OleDbCommand comm=conn.CreateCommand();
OleDbTransaction tran=conn.BeginTransaction();
comm.Connection=conn;
comm.Transaction=tran;
int count=ds.Tables[0].Rows.Count;
DataRow dr;
string id,name,sql;
byte[] photo;
for(int i=0;i<count;i++)
{
dr=ds.Tables[0].Rows[i];
id=dr[0].ToString().Trim();
name=dr[1].ToString().Trim();
photo=(byte[])dr[2];
sql="Insert Into Users (ID,Name,Photo) Values (@id,@name,@photo)"; comm.Parameters.Add("@id",id);
comm.Parameters.Add("@name",name);
comm.Parameters.Add("@photo",OleDbType.VarBinary,photo.Length).Value=photo; comm.CommandText=sql;//这句肯定不对,应该怎么写?
comm.ExecuteNonQuery();
}
tran.Commit();

解决方案 »

  1.   


                conn.Open();
                OleDbCommand comm=conn.CreateCommand();
                OleDbTransaction tran=conn.BeginTransaction();
                comm.Connection=conn;
                comm.Transaction=tran;
                int count=ds.Tables[0].Rows.Count;
                DataRow dr;
                string id,name,sql;
                byte[] photo;
                for(int i=0;i<count;i++)
                {
                    dr=ds.Tables[0].Rows[i];
                    id=dr[0].ToString().Trim();
                    name=dr[1].ToString().Trim();
                    photo=(byte[])dr[2];
                    sql="Insert Into Users (ID,Name,Photo) Values (@id,@name,@photo)";                comm.CommandText=sql;//可能你会觉得这一句应该放这里。不过也是不对的。
                      //如果sql是不带参数的,那就没问题。问题是要带参数,该怎么处理?                comm.Parameters.Add("@id",id);
                    comm.Parameters.Add("@name",name);
                    comm.Parameters.Add("@photo",OleDbType.VarBinary,photo.Length).Value=photo;
                      comm.ExecuteNonQuery();
                }
                tran.Commit();
      

  2.   

    SqlTransaction sqlTransaction = _sqlConnection.BeginTransaction();
                try
                {
                    sqlCommand.Transaction = sqlTransaction;
                    foreach (string sql in sqls)
                    {                    sqlCommand.CommandText = sql;
                        sqlCommand.ExecuteNonQuery();
                    }
                    sqlTransaction.Commit();
                                }
                catch (Exception)
                {
                    sqlTransaction.Rollback();
                    throw;
                                }
                finally
                {
                    sqlTransaction.Dispose();
                    sqlCommand.Dispose();
                }
      

  3.   


    问题的关键是字符串sql是带参数的,你这样写的结果跟我上面是一样的。。
      

  4.   

    事务写法见4楼
    批量更新可以这样
    SqlDataAdapter dataAdapter = new SqlDataAdapter(SQL, CONNECTION);
    string insertSQL = "INSERT INTO [Employee]([name], [age]) VALUES(@name, @age)";SqlCommand insertCmd = new SqlCommand(insertSQL, CONNECTION);
    insertCmd.Parameters.Add(new SqlParameter("@name", SqlDbType.Char, 32, "name"));//name是DataTable中对应的列名
    insertCmd.Parameters.Add(new SqlParameter("@age", SqlDbType.Real, 8, "age"));dataAdapter.InsertCommand = insertCmd;
    insertCmd.UpdatedRowSource = UpdateRowSource.None;dataAdapter.UpdateBatchSize = 0;
    dataAdapter.Update(DataTable);
      

  5.   

    看看  http://topic.csdn.net/t/20040608/10/3072689.html  邹建的解答吧!
      

  6.   

     comm.CommandText=sql;和你这句没关系你的错误已经报的很明确了.你好好查一下吧.错误信息: 由于将在索引、主关键字、或关系中创建重复的值,请求对表的改变没有成功。改变该字段中的或包含重复数据的字段中的数据,删除索引或重新定义索引以允许重复的值并再试一次 实际上我调试过,主键id并没有重复。你最好的马主键那列的值在单步调试下查一查
      

  7.   

    大家帮我对比一下,如果我写成下面这样,可正常插入,但是photo这个字段怎么办?
                conn.Open();
                OleDbCommand comm=conn.CreateCommand();
                OleDbTransaction tran=conn.BeginTransaction();
                comm.Connection=conn;
                comm.Transaction=tran;
                int count=ds.Tables[0].Rows.Count;
                DataRow dr;
                string id,name,sql;
                byte[] photo;
                for(int i=0;i<count;i++)
                {
                    dr=ds.Tables[0].Rows[i];
                    id=dr[0].ToString().Trim();
                    name=dr[1].ToString().Trim();
                    photo=(byte[])dr[2];
                    sql="Insert Into Users (ID,Name) Values ('{0}''{1})";
                    sql=string.Format(sql,id,name);
                    comm.CommandText=sql;                comm.ExecuteNonQuery();
                }
                tran.Commit();
      

  8.   

    我同学帮我找到原因了。。
    只需加一句:
    comm.Parameters.Clear();谢谢各位,散分了