badge1 work_hour
1       25
2       40
k       25 這行類型錯誤
4       26
我想導入一批數據,本來我想如果有一行出錯數據不導入,但執行下面的代碼時,在出錯的行代碼上面的數據刪除了,但是出錯行下面的數據確存入了數據庫,誰可以幫我想想辦法,或是由別的辦法顯現這樣的功能
for(int i=0; i<myDs.Tables[0].Rows.Count; i++)
{
strSql="insert into zhch_nianxiu (badge1,work_hour) values ('"+  myDs.Tables[0].Rows[i].ItemArray[0].ToString() + 
"','"+  myDs.Tables[0].Rows[i].ItemArray[1].ToString() +"')"; 
try
{
myCmd=new OleDbCommand(strSql,conn);
myCmd.ExecuteNonQuery();
}
catch
{  
int j=i+2;
Response.Write("<script language='javascript'>alert('第"+ j +"行導入失敗')</script>");
for(int k=0; k<myDs.Tables[0].Rows.Count; k++)
{
if(k!=i)
{
strSql="delete zhch_nianxiu where badge1='"+  myDs.Tables[0].Rows[k].ItemArray[0].ToString() + "'";
myCmd=new OleDbCommand(strSql,conn);
myCmd.ExecuteNonQuery();
}
}
}

解决方案 »

  1.   

    if(isnum(myDs.Tables[0].Rows[i].ItemArray[0].ToString()))
    {
    insert....
    }private bool isnum(string s)
    {
    //判断s是不是数值型
    }
      

  2.   

    你把类型错误的行给跳过不就可以了?为什么要用异常来继续下一条呢?如果是类型正确,但是插入数据库出错你也跳过?先检查你的badge1 work_hour的类型是否符合你的要求,然后在统一插入数据库中。
    而1楼所说的事务在.net下是很容易的。
    OleDbConnection Conn = new OleDbConnection(ConnString);
    Conn.Open();
    OleDbCommand cmd=new OleDbCommand(Conn);
    OleDbTransaction myTrans=Conn.BeginTransaction();
    cmd.Transaction = myTrans;
    try
    {
    for(int i=0;i<循环次数;i++)
    {
    //你的数据库插入操作
    }
     myTrans.Commit();
    }
    catch()
    {
    myTrans.Rollback()
    }
    finally
    {
      关闭数据库
    }大体上就这样。随便写了一下。你自己调试一下。
      

  3.   

    参考下面:
    这里可以转为c#:
    http://www.developerfusion.co.uk/utilities/convertvbtocsharp.aspx
    --------------------------------------------------------------
    Public Sub Execute_SQL(ByVal Q As String) '执行数据库命令
            If isConnect() Then
                Dim sqlCM As New SqlCommand("", cnn)
                Dim sqlTran As SqlTransaction = cnn.BeginTransaction(IsolationLevel.ReadCommitted, "myTran") '定义事务
                Try
                    sqlCM.Transaction = sqlTran '启动事务
                    sqlCM.CommandText = Q
                    sqlCM.ExecuteNonQuery()
                    sqlTran.Commit() '执行事务
                Catch ex As Exception
                    sqlTran.Rollback("myTran") '事务回滚
                    Show_Msg(ex.Message, errMsg)
                Finally
                    closeDB()
                    GC.Collect()
                End Try
            End If
        End Sub
      

  4.   

    OleDbConnection Conn = new OleDbConnection(ConnString);
    Conn.Open();
    OleDbCommand cmd=new OleDbCommand(Conn);
    OleDbTransaction myTrans=Conn.BeginTransaction();
    cmd.Transaction = myTrans;
    try
    {
    for(int i=0;i<循环次数;i++)
    {
    数据库插入操作
    }
     myTrans.Commit();
    }
    catch()
    {
    myTrans.Rollback()
    }
    finally
    {
      关闭数据库
    }
    但是執行道cmd.Transaction = myTrans;出錯
    Object reference not set to an instance of an object. 誰告訴我怎麼回事
      

  5.   

    OleDbConnection conn =new OleDbConnection(CnnString);
    conn.Open ();
    OleDbCommand myCmd =new OleDbCommand();
    OleDbTransaction myTrans=conn.BeginTransaction();
    myCmd.Transaction = myTrans;
    try

    for(int i=0; i<myDs.Tables[0].Rows.Count; i++)
    { myCmd.CommandText= "insert into zhch_nianxiu (badge1,work_hour) values ('"+  myDs.Tables[0].Rows[i].ItemArray[0].ToString() + "','"+  myDs.Tables[0].Rows[i].ItemArray[1].ToString() +"')";
    myCmd.ExecuteNonQuery();

    }
    myTrans.Commit();
    try部分怎麼執行不了
      

  6.   

    問題System.InvalidOperationException: ExecuteNonQuery: Connection property has not been initialized