求助题目:表DataTable结构有5个字段   CvsId  DataId  DataType  Size  Value假设有个名字为dataSend的函数,此函数以每秒会发送1-10000条数据不等的速度持续发送数据过来,
以结构体形式发送,上述5个字段的值都是封在结构体中的设计一个接口,接收dataSend发送过来的数据,并写入数据库DataTable表中  要求: 1,当接收的数据达到10000条时,一次性将数据存入DataTable表中,不够10000条时先预存起来不插入
2,如果从开始接收据后10秒钟时还没有收到10000条记录,那么将这10秒接收的数据插入DataTable表中 
           (有多少条插入多少条)
3,一次性向表中插入10000条数据的时间不能超过1000毫秒(尽可能高效)如何设计函数接口(c++实现,数据库为SqlServer2005)及sql语句来实现上述功能主要是框架和sql语句的写法,执行sql语句可以用Excute(string sqlStr)来完成,小弟初步想用存储过程来写,但是效率总上不来,请高手们帮帮忙

解决方案 »

  1.   

    个人浅见时间点的控制,比如:10S 做什么做什么,感觉这些在程序里面做就好了至于 10000条是否满足,可在存储过程里面判断,不满足插入到另外一个表里面,满足你上面的条件后再一次性插入到表DataTable
      

  2.   


    现在的设想是10000条也在程序里判断,之前的数据先存到字符串里,满足条件一次性传给存储过程,插入DataTable表。因为接收数据的速度会很快,量也会很大,所以尽可能的减小数据库操作次数,减小数据库的负担。  其实主要还是按照记录数量来判断,时间上的判断可以后期再加进去,关键是存储过程的写法很头疼
      

  3.   

    给你个思路吧把你要插入的记录拼接成xml,在存储过程解开XML一词性插入,速度就可能达到你的要求(硬件还是有点要求的)
      

  4.   

    建个xml树也是很耗资源的,我想把每条记录叠加存在一个超长字符串中,然后一次性传给存储过程,在过程内循环拆分插入到表中,但是不知道具体怎么拆分才能够按表的字段来插入呢 
    就比如说我传进来 01 zhang 25 beijing 02 li 22 shanghai   我把它们存到一个字符串中,当然中间可以加任何分隔字符,只要有利于插入的时候区分字段就可以,然后一次性传入,想达到插入后
    id name  age addr
    01 zhang 25  beijing 
    02 li    22  shanghai
    这种效果,要怎么写呢
      

  5.   

    如果没有太多其他操作的话,没有必要10000条保存一次吧。
    用SQL语句只能从一个表的数据完成批量插入的。形成XML字符串是一个方法,如果不这样,只能形成一个格式字符串,保存为本地文件,然后用类似bcp之类的方法批量导入,否则,只能用MSSQL的内部接口了,应该有直接从内存批量插入数据的接口的。
      

  6.   

    字符串是不行的xml是验证过的
      

  7.   

    字符串在传参数的时候有问题,比如我插入4个字段,但是我只传一个长字符串进去,语法错误,不让这么定义存储过程,不知道怎么解决用xml的情况能给个具体的实例吗
      

  8.   

    想了一种效率比较高的方法,但是貌似行不通,大家帮忙看下
    DataTable表有5个字段
    因为
    insert into DataTable select '1','11','s','5','abcde' union all   select '2','15','b','6','abcdef'; 这样可以向DataTable表中插入2行记录所以我想可不可以这样:declare @strData varchar;
    set @strData = '1'',''11'',''s'',''5'',''abcde'' union all select ''2'',''15'',''b'',''6'',''abcdef';定义这样一个字符串作为参数传给存储过程但是存储过程的定义我就不会写了create procedure add_table @strData varchar as insert into table select @strData;
    exec add_table @strData;大概思路是这样,但是定义的时候因为表有5个字段,这样传一个参数会出现
    “插入错误:列名或所提供值的数目与表定义不匹配”这种情况有什么办法可以解决吗?大家帮忙参考下
      

  9.   

    可不可以控制一下datasend函数,让它累积到10000条数据的时候在发送。没有就先缓存起来。这样数据库这边就可以只管插入,不管判断。
      

  10.   

    刚才看到一篇文章,如果数据量不是太大的话,可以使用union,网址:
    http://www.cio360.net/h/1784/321881-2028.html,我在sqlserver中试过了,语法上没问题,实际速度不知道如何。