您的问题可能是超过8000个字符长度的字符串无法存入SQL数据库中,而在SQL中的TEXT类型并没有任何的长度限制(实际极限长度为2,147,483,647,即2的23次方减1),之所以出现这个问题,是由于下面的原因:在MIS SQL Server中,当数据小于 8000 个字节时,可以用普通的SQL操纵语句(SELECT、INSERT、UPDATE、DELETE)来完成对字段的操纵,当数据大于8000个字节时,SQL提供了 WRITETEXT 、READTEXT和UPDATETEXT这三个函数来读取和修改数据。这三个函数的使用方法为:
(1) WRITETEXT {table.column text_ptr}[WITH LOG] {data} 
table.column为表中的字段,text_ptr为一个16个字节的指针,data为要写的数据值。可
选参数WITH LOG表示是否要写入日志文件中。
例: DECLARE @ptrval  binary(16) --指针
    SELECT @ptrval = TEXTPTR(img_ct) FROM zy_ct WHERE id_ct = 20010101001
    WRITETEXT zy_ct.img_ct @ptrval 0x024324142342134214213421421454353452341
(2) READTEXT {table.column text_ptr offset size} [HOLDLOCK]
table.column为表中的字段,text_ptr为一个16个字节的指针,offset 为偏移量,即从
第几个字节开始读数据,size为要读的字节数,HOLDLOCK 为在读数据中是否充许其他用户
修改该数据。
例:DECLARE @ptrval varbinary(16)
    SELECT @ptrval = TEXTPTR(img_ct) FROM zy_ct WHERE id_ct = 20010101001
    READTEXT zy_ct.img_ct @ptrval 1 25
(3) UPDATETEXT {table_name.dest_column_name dest_text_ptr}{NULL|insert_offset}
{ NULL | delete_length}[WITH LOG][ inserted_data| {table_name.src_column_name src_text_ptr}]
table_name.dest_column_name 为要修改的text, ntext, 或 image字段;
dest_text_ptr为指向其的指针;insert_offset为偏移量,对于text和image为从
第几开始字节开始写,对于ntext为从第几个字符(双字节)开始写;delete_length
为从insert_offset开始删除delete_length长度的字节(符),为0时不删除,为NULL时
为删除从insert_offset开始到结束的所有数据。要插入的数据为 inserted_data为,也可
是表table_name的src_column_name字段中指针 src_text_ptr所指数据。
例: DECLARE @ptrval binary(16)
    SELECT @ptrval = TEXTPTR(img_ct) FROM zy_ct WHERE id_ct = 20010101001
    UPDATETEXT zy_ct.img_ct @ptrval 16 0x54345
可以看出,这三个函数的使用比较复杂,虽然可以通过生成存贮过程来调用执行,但有一个缺陷是在读取数据时,READTEXT函数读取的数据无法直接传递回前端应用程序。

解决方案 »

  1.   

    同意楼上的意见,VERY GOOD
      

  2.   

    to benediction (一颗神石) :
    如果你学的这个方法合适也可以这样用。我在一个应用程序中是这样用的,曾试过入300K的文本,没有问题,不过效率不知道怎么样,请大家帮我看看
    系统:WIN2K+SQL2K
    @content 是存储过程的一个参数,类型是text型更新:
    update newtable set content=@content where id=@id读取数据
    select content from newtable where id=@id插入
    insert into newtable(contnet) values(@content)
      

  3.   

    谢谢各位,我现在基本已经解决了,采用二进制流的形式将文件存入sql server数据库,再用二进制流读出,我引入的是一个100k的word文档,然后把他读出,没问题,我下在把它贴出来,大家看看,还有什么好的建议没有。
    //从数据库中读取并生成大二进制文件
    //参数sql只返回一个字段,即大二进制文件那个字段;FileName,生成的文件名
      public void WriteToFileByOdbc(String sql,String FileName){
        int countInt=0;String strDBError="";    try{
          Rst = Stmt.executeQuery(sql);
          if (Rst.next()){
             InputStream ins=Rst.getBinaryStream(1);
             FileOutputStream fos=new FileOutputStream(FileName);
            int readbyte=0;
            while (true)
             {
               readbyte=ins.read();
              if (readbyte==-1)
                   break;
               fos.write(readbyte);
             }
              ins.close();
              }
            countInt=1;//写入成功
            }catch(FileNotFoundException aa){
              countInt=-1;
              strDBError="File error:"+aa.getMessage();
              System.out.println("File error");
            }catch(SQLException sqly){
              countInt=-1;
              strDBError="SQL error:"+sqly.getMessage()+"<p>"+sql;
              System.out.println("Sql error");
            }catch(IOException io){
              countInt=-1;
              strDBError="IO error:"+io.getMessage();
              System.out.println("IO error");
            }
       }