cmd->CommandType = CommandType::StoredProcedure;

解决方案 »

  1.   

    cmd->Parameters->Add(L"@chkDesc",   SqlDbType::VarChar, 300);
    cmd->Parameters->Add(L"@LetRoomID", SqlDbType::VarChar, 20);
    cmd->Parameters->Add(L"@chkTypeID", SqlDbType::Int, 4);
    cmd->Parameters->Add(L"@chkResult", SqlDbType::Int, 4);
    cmd->Parameters->Add(L"@WorkerID",  SqlDbType::VarChar, 20);
    DateTime ^dtNow3 = DateTime::Now;
    for each(DataRow^ dr in tbChk->Rows){
    //DateTime ^dtNow3 = DateTime::Now;
    if(dr->IsNull(dcLetChkDesc) || String::IsNullOrEmpty(dr[dcLetChkDesc]->ToString()->Trim()))
    cmd->Parameters[0]->Value = DBNull::Value;
    else
    cmd->Parameters[0]->Value = dr[dcLetChkDesc]->ToString(); if(dr->IsNull(dcLetChkLetID) || String::IsNullOrEmpty(dr[dcLetChkLetID]->ToString()->Trim()))
    cmd->Parameters[1]->Value = DBNull::Value;
    else
    cmd->Parameters[1]->Value = dr[dcLetChkLetID]->ToString(); if(dr->IsNull(dcLetChkTypeID))
    cmd->Parameters[2]->Value = DBNull::Value;
    else
    cmd->Parameters[2]->Value = Convert::ToInt32(dr[dcLetChkTypeID]);

    if(dr->IsNull(dcChkResult))
    cmd->Parameters[3]->Value = DBNull::Value;
    else
    cmd->Parameters[3]->Value = Convert::ToInt32(dr[dcChkResult]); cmd->Parameters[4]->Value = strWorkerID; /*if(!m_dbAccess->RunProc(L"proc_sys_getLetChk", params1, sqlTran))
    throw gcnew Exception();*/
    cmd->ExecuteNonQuery();
    //dtNowE = DateTime::Now;
    //AddTest(strWorkerID, dtNow3, dtNowE, L"each", (int)RetEnum::RET_OK);
    }
    dtNowE = DateTime::Now;
    AddTest(strWorkerID, dtNow3, dtNowE, L"DispatchTask1", (int)RetEnum::RET_OK);
      

  2.   

    你如果不用webservcie呢?这个瓶颈应该是在数据库端,不会在客户端的
      

  3.   

    以上为主要代码,其中,数据行中每一列用如下方式取得:
    DataColumn ^dcLetChkDesc = tbChk->Columns[L"rrsiicRes"], ^dcLetChkLetID = tbChk->Columns[L"rrsNum"],
       ^dcLetChkTypeID = tbChk->Columns[L"rrsiicID"],    ^dcChkResult   = tbChk->Columns[L"rrsiicResult"];基本情况:
        该 WebService 作为中介,介于客户端与后台管理系统之间,由客户端向 Webservice 发起请求,只后WebService 向后台管理系统请求获取数据,后台管理系统结果以 DataSet 参数形式传回。问题:
        在获得管理系统数据之后,发现如果数据 在大约 400 条左右,该段入库代码执行大约 2.343 秒 级别。如果在代码前后加事务处理,多人访问该方法时,将发生进程间事务锁定冲突,无法入库。
    向各位高手求解:
        代码编写是否合理? 如何进行优化,以提高入库效率?
      

  4.   

    感谢 jinjazz 回复。
    情况是这样的:这个客户端是移动设备,WebService 是作为中间层,负责终端与后台系统之间数据交互。
      

  5.   

    1.你应该直接写代码测试下这400条记录入库的性能(也许问题不在webservice)
    2.Dataset是一个较大的XML,请测试下下直接重webservice取这个Dataset的效率
    3.找到问题后再考虑其他因素及优化。
    4.对于Dataset的数据插入应该可以只调一次数据库,
      

  6.   

    zbjg  4.对于Dataset的数据插入应该可以只调一次数据库,如果这样可以实现,的确能大幅提高效率。现在我的做法是, 获取DataSet 中每一行,之后通过 SqlCommand 用存储过程写入数据库,这个执行次数等于 DataSet 中数据行数。执行次数确实比较多。
      

  7.   

    1 你在查询分析器执行 400次 proc_sys_getLetChk 是否要2秒?如果有,那么就调优你的存储过程吧.
    2 WEB SERVICE的请求还需要经过打包XML的SOAP请求,收到后还要转换为你的参数,这一块其实也是性能的瓶颈.
      

  8.   

    这个过程是在数据集已经获得,通过循环存入数据库时测试的时间,不包括网络传输时间。 
    运用的是存储过程方式写入数据库。 
    存储过程如下: 
    proc proc_sys_getLetChk --从管理系统下载检查信息
    (
    @chkDesc varchar(300),
    @LetRoomID varchar(20),
    @chkTypeID int,
    @chkResult int,
    @WorkerID varchar(20)
    )
    asdeclare @iErrors int
    set @iErrors = 0if(not exists(select * from CheckItems where LetRoomID = @LetRoomID 
                          and WorkerID = @WorkerID
                          and chkTypeID = @chkTypeID))
    begin
        insert into CheckItems(chkDesc,LetRoomID, chkTypeID,chkResult,WorkerID)
        values(@chkDesc,@LetRoomID,@chkTypeID,@chkResult,@WorkerID)
        set @iErrors = @iErrors + @@error
    end
    else
    begin
        update CheckItems
        set chkResult = @chkResult,
            chkDesc   = @chkDesc
        where LetRoomID = @LetRoomID 
           and WorkerID = @WorkerID
           and chkTypeID = @chkTypeID
        set @iErrors = @iErrors + @@error
    endif(0 != @iErrors)
        begin
            return -1
        end
    else
        begin
            return 0
        end
      

  9.   

    与是不是webservice没有什么关系的吧。。这种循环应该弄成批量操作。这样估计在哪里执行都不可能好受的
      

  10.   

    批量执行,是否构建类似:
    exec proc_sys_getLetChk ...
    .
    .
    .一批,之后送入数据库执行?这是个好思路,我试试,估计的确会提高效率!
      

  11.   

    16楼  caicai_45 
    我没太明白你的意思,是不是如下过程:
    启动事务-〉循环执行-〉提交事务。
    我的过程是这样的,比较简单,希望多多指点。