SQL:在VarBinary列上顺序更新.WRITESQLServer2005Express上的(max)列。一切正常-该列已按应有的方式填充,但我的机器似乎仍在将所有内容缓冲到内存中,我只是不明白为什么。我正在使用以下代码(C#):using(IDbConnectionconnection=newSqlConnection(ConfigurationManager.ConnectionStrings[1].ConnectionString)){connection.Open();字符串id=Guid.NewGuid().ToString();使用(IDbCommand命令=connection.CreateCommand()){command.CommandText="INSERTINTO[BLOB]([Id],[Data])VALUES(@p1,0x0)";SqlParameterparam=newSqlParameter("@p1",SqlDbType.VarChar);param.Value=id;命令.Parameters.Add(参数);命令.ExecuteNonQuery();}if(File.Exists(textBox1.Text)){using(IDbCommandcommand=connection.CreateCommand()){command.CommandText="UPDATE[BLOB]SET[Data].WRITE(@data,@offset,@len)其中[Id]=@id";SqlParameterdataParam=newSqlParameter("@data",SqlDbType.VarBinary);命令.Parameters.Add(数据参数);SqlParameteroffsetParam=newSqlParameter("@offset",SqlDbType.BigInt);命令.Parameters.Add(offsetParam);SqlParameterlengthParam=newSqlParameter("@len",SqlDbType.BigInt);命令.参数。添加(长度参数);SqlParameteridParam=newSqlParameter("@id",SqlDbType.VarChar);命令.Parameters.Add(idParam);idParam.Value=id;使用(FileStreamfs=newFileStream(textBox1.Text,FileMode.Open,FileAccess.Read,FileShare.Read)){byte[]buffer=newbyte[2090400];//块大小是8040字节的倍数。int读取=0;int偏移量=0;while((read=fs.Read(buffer,0,buffer.Length))>0){dataParam.Value=buffer;offsetParam.Value=偏移量;lengthParam.Value=读取;命令.ExecuteNonQuery();偏移+=读取;}}}}}谁能告诉我为什么它将文件缓冲到内存中?我使用的byte[]缓冲区大小只有2MB我可以为每个块创建一个新缓冲区,但这似乎也是对CPU/内存的浪费......它缓冲它是因为当你将它保存到varbinary列时,它成为sqlserver中LOB数据缓存的一部分。这是它的工作原理。或者你的意思是它在别处缓冲?FileStream类缓冲输入和输出。您可以在每次更新后调用Flush()方法来清除内部缓冲区。需要明确的是,它最多只能缓冲缓冲区大小(4KB)。在这种情况下,我认为你的罪魁祸首是SqlExpress。当我执行你的代码并写入我的本地SqlExpress副本时,sqlsrvr进程的内存使用量增加了大约1GB。当我写入非本地数据库时,我的内存使用量保持不变。以上就是C#学习教程:SQL:ExecuteUPDATE.WRITEonorderontheVarBinarycolumn。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
