一个SqlCommand的Sql语句长为110000,加2000个参数执行时报上述常规网络错误。SQL语句没有问题,在同一个事务中执行。当长度在80000就没有问题。这个上限有没有设置的地方?各位求救。

解决方案 »

  1.   

    .net 1.1 + sql server 2000:上限是4k,找不到设置的地方只能用多次查询的方法来做……
      

  2.   

    这么长的SQL? 2000个参数?当你这么做时已经死了
      

  3.   

    4K是它内部设置的SOCKET缓存长度,估计它在设计时没考虑到你这样的应用,汗
      

  4.   

    多次查询吧.光传这sql就把网络给累死了.参数这么多,强啊.
      

  5.   

    我把一行数据封装成一个类.每一个该类的实例往数据库保存时都对应一条insert 语句.当同时保存200个实例时问题就出现了.很可能还有300个呢.
      

  6.   

    我的做法是有多少条记录都生成一个SQL语句,这样可以在一个事务中处理嘛。最后那个SQL语句太长了。
      

  7.   

    “mobydick(敌伯威|我排著队拿著爱的号码牌) ”你说做法有问题。但如果要在一个有30列的表中插入200条记录,且没有相互重复的数据,要求在一个事务中执行,还有别的办法吗?请指点一下吧。如果里边来有修改、删除什么的。我这个保存的方法是通用的。
      

  8.   

    1.多次查询为什么不能在一个事务中完成,而将它生成一条SQL语句?ado.net本身的事务机制,是以连接为一事务周期的,所以只要是同一连接的操作,可以在一个事务中完成.
    2.一个表如果有几十个字段,其实是比较少见的吧.数据库的可能还是需要提练的.
      

  9.   

    多条记录可以在一个事务中用循环插入。
    语句类似于下面:
    sqlCommand.Transaction=connection.BeginTransaction();
    sqlCommand.Execute(.....)
    sqlCommand.Commit()(或Rollback)
      

  10.   

    你的数据结构一定有问题,在我们公司,编程手册中明确规定:sql语句或存储过程不得超过200行,超过一定是数据结构有问题或方法有问题.不要简单的用代码堆砌,好好想想.
      

  11.   

    zmofcsdn(张三) ( ) 信誉:100  2006-3-15 17:25:53  得分: 0  
     
     
       
    “mobydick(敌伯威|我排著队拿著爱的号码牌) ”你说做法有问题。但如果要在一个有30列的表中插入200条记录,且没有相互重复的数据,要求在一个事务中执行,还有别的办法吗?请指点一下吧。如果里边来有修改、删除什么的。我这个保存的方法是通用的。  
     
    ===================================================================================新增、修改、删除都可以做成存储过程,或者不想做成存储过程也行,可以直接把带参数SQL语句保存在程序中。这样,对于一个操作来说,参数就是最多30个。
    使用事务不一定必须要在sql语句中实现事务,使用ado.net中的事务也是一样的。下面的帖子中是实例代码,使用一个for循环,执行10次insert语句。
      

  12.   

    private static void ExecuteSqlTransaction(string connectionString)
    {
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
    connection.Open(); SqlCommand command = connection.CreateCommand();
    SqlTransaction transaction; // Start a local transaction.
    transaction = connection.BeginTransaction("SampleTransaction"); // Must assign both transaction object and connection
    // to Command object for a pending local transaction
    command.Connection = connection;
    command.Transaction = transaction; try
    {
    //以下代码是我修改的
    //增加了for
    for(int i = 0; i < 10; ++i)
    {
    //下面的commandtext可以根据需要换成update,delete
    command.CommandText =
    "Insert into Region (RegionID, RegionDescription) VALUES (i, 'Description')";//RegionID = i
    command.ExecuteNonQuery();
    }//for
    //以上代码是我修改的 // Attempt to commit the transaction.
    transaction.Commit();
    Console.WriteLine("Both records are written to database.");
    }
    catch (Exception ex)
    {
    Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
    Console.WriteLine("  Message: {0}", ex.Message); // Attempt to roll back the transaction.
    try
    {
    transaction.Rollback();
    }
    catch (Exception ex2)
    {
    // This catch block will handle any errors that may have occurred
    // on the server that would cause the rollback to fail, such as
    // a closed connection.
    Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
    Console.WriteLine("  Message: {0}", ex2.Message);
    }
    }
    }
    }
      

  13.   

    ft,忘了说了,这个例子是msdn里的,我改了注释中指出的那部分代码,这个例子是.NET Framework 2.0中的例子。
      

  14.   

    用显示事务就解决的问题,
    没你说得那么麻烦,
    N多个操作(增,删,改)都可以放到一个事务中,但不是一个sql,
    什么时候你想提交了,提交整个事务就行了,
    出错了,直接用事务回滚就行了,所有做的操作,都会作为一个整体回滚掉.用 soaringbird(飞翔鸟) ( ) 信誉:100  的方法就行.
    而且,你那种一个sql字符串中的多个操作,好像也不是在一个事务中的吧(我记得sql server中是这么说的.).所以,建议正确的思路是 开 ado的显示事务.
      

  15.   

    多谢各位提供的思路。soaringbird(飞翔鸟)、mobydick(敌伯威|我排著队拿著爱的号码牌)等等的朋友们。如果能设置1000分的题目就好了,分少热心的弟兄多哪!说一下为什么要这么做。
    我们做了一个专门的数据访问组件。采用所谓面向对象的思路,该组件的使用者不用组织SQL语句。他们只需创建数据包的实例设置数据包的属性,传给数据访问组件即可。这个数据访问组件比较通用,有人传入的数据包个数少,有人传入的多,所以......。我用soaringbird、mobydick的方法试试应该没问题。多谢了弟兄们。