Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# const int CHUNK_SIZE=8*1024; 如果(!objStream.CanRead) 抛出新的NotSupportedException(“流不可读”); 长l_lOldPosition=对象流位置; SQLiteConnection l_objConnection=getConnection(); byte[]lar_byBuffer=新字节[CHUNK_SIZE]; SQLiteParameter l_objID=新的SQLiteParameter(“@id”,DbType.String); l_objID.Value=strID; SQLiteParameter l_objContent=newsqliteparameter(“@new_content”,DbType.Binary); l_objContent.Value=lar_byBuffer; SQLiteParameter l_objChunk=新的SQLiteParameter(“@chunk”,DbType.Int32); SQLiteParameter l_objSize=新的SQLiteParameter(“@size”,DbType.Int32); SQLiteCommand l_objCommand=新的SQLiteCommand(l_strInsertQuery,l_objConnection); l_objCommand.Parameters.Add(l_objID); l_objCommand.Parameters.Add(l_objContent); l_objCommand.Parameters.Add(l_objChunk); l_objCommand.Parameters.Add(l_objSize); 整数l_i返回,l_lBytesRead; int l_iChunk=0;//当前“子块” int l_idbcunk=0;//数据库上的当前块 长l_lDBChunkLength=0;//块的当前长度 l_objChunk.Value=l_idbcunk; //交易 使用(SQLiteTransaction l_objTransaction=l_objConnection.BeginTransaction()) { //从流中读取文件 而((l_lBytesRead=objStream.Read(lar_byBuffer,0,lar_byBuffer.Length))>0) { //检查下一个区块 如果((l_lDBChunkLength+l_lBytesRead)>=SQLITE_MAX_BLOB_LENGTH) { l_objCommand.CommandText=l_strInsertQuery; l_iChunk=0;//重置“子块”计数器 l_lDBChunkLength=0;//重置块大小 l_idbcunk++;//增加块ID l_objChunk.Value=l_idbcunk; } l_lDBChunkLength+=l_lBytesRead;//增加块的长度 l_objContent.Size=l_lBytesRead;//内容字段的长度 l_objSize.Value=l_lBytesRead;//块长度(写入“大小”列) #区域写入 尝试 { l_iReturn=l_objCommand.ExecuteNonQuery(); 如果(l_iChunk==0) { l_objCommand.CommandText=l_strUpdateQuery; } } 捕获(例外情况除外) { l_objTransaction.Rollback(); 闭合连接(l_对象连接); string l_strMessage=string.Format(“文件{0}、DB chunk{1}、chunk{2}:\n{3}”、strID、l_idbcunk、l_iChunk、ex.Message上的SQLite异常); 抛出新的OfflineStorageException(l_strMessage,ex); } 如果(l_iReturn!=1) { l_objTransaction.Rollback(); 闭合连接(l_对象连接); string l_strMessage=string.Format(“文件{0}的DB chunk{1},chunk{2}未插入到DB上。”,strID,l_idbcunk,l_iChunk); 抛出新的OfflineStorageException(l_strMessage); } #端区写入 l_iChunk++; } l_objTransaction.Commit(); } l_objCommand.Dispose(); 闭合连接(l_对象连接); objStream.Position=l_lOldPosition; } }_C#_Sqlite_Ado.net_System.data.sqlite - Fatal编程技术网

C# const int CHUNK_SIZE=8*1024; 如果(!objStream.CanRead) 抛出新的NotSupportedException(“流不可读”); 长l_lOldPosition=对象流位置; SQLiteConnection l_objConnection=getConnection(); byte[]lar_byBuffer=新字节[CHUNK_SIZE]; SQLiteParameter l_objID=新的SQLiteParameter(“@id”,DbType.String); l_objID.Value=strID; SQLiteParameter l_objContent=newsqliteparameter(“@new_content”,DbType.Binary); l_objContent.Value=lar_byBuffer; SQLiteParameter l_objChunk=新的SQLiteParameter(“@chunk”,DbType.Int32); SQLiteParameter l_objSize=新的SQLiteParameter(“@size”,DbType.Int32); SQLiteCommand l_objCommand=新的SQLiteCommand(l_strInsertQuery,l_objConnection); l_objCommand.Parameters.Add(l_objID); l_objCommand.Parameters.Add(l_objContent); l_objCommand.Parameters.Add(l_objChunk); l_objCommand.Parameters.Add(l_objSize); 整数l_i返回,l_lBytesRead; int l_iChunk=0;//当前“子块” int l_idbcunk=0;//数据库上的当前块 长l_lDBChunkLength=0;//块的当前长度 l_objChunk.Value=l_idbcunk; //交易 使用(SQLiteTransaction l_objTransaction=l_objConnection.BeginTransaction()) { //从流中读取文件 而((l_lBytesRead=objStream.Read(lar_byBuffer,0,lar_byBuffer.Length))>0) { //检查下一个区块 如果((l_lDBChunkLength+l_lBytesRead)>=SQLITE_MAX_BLOB_LENGTH) { l_objCommand.CommandText=l_strInsertQuery; l_iChunk=0;//重置“子块”计数器 l_lDBChunkLength=0;//重置块大小 l_idbcunk++;//增加块ID l_objChunk.Value=l_idbcunk; } l_lDBChunkLength+=l_lBytesRead;//增加块的长度 l_objContent.Size=l_lBytesRead;//内容字段的长度 l_objSize.Value=l_lBytesRead;//块长度(写入“大小”列) #区域写入 尝试 { l_iReturn=l_objCommand.ExecuteNonQuery(); 如果(l_iChunk==0) { l_objCommand.CommandText=l_strUpdateQuery; } } 捕获(例外情况除外) { l_objTransaction.Rollback(); 闭合连接(l_对象连接); string l_strMessage=string.Format(“文件{0}、DB chunk{1}、chunk{2}:\n{3}”、strID、l_idbcunk、l_iChunk、ex.Message上的SQLite异常); 抛出新的OfflineStorageException(l_strMessage,ex); } 如果(l_iReturn!=1) { l_objTransaction.Rollback(); 闭合连接(l_对象连接); string l_strMessage=string.Format(“文件{0}的DB chunk{1},chunk{2}未插入到DB上。”,strID,l_idbcunk,l_iChunk); 抛出新的OfflineStorageException(l_strMessage); } #端区写入 l_iChunk++; } l_objTransaction.Commit(); } l_objCommand.Dispose(); 闭合连接(l_对象连接); objStream.Position=l_lOldPosition; } }

C# const int CHUNK_SIZE=8*1024; 如果(!objStream.CanRead) 抛出新的NotSupportedException(“流不可读”); 长l_lOldPosition=对象流位置; SQLiteConnection l_objConnection=getConnection(); byte[]lar_byBuffer=新字节[CHUNK_SIZE]; SQLiteParameter l_objID=新的SQLiteParameter(“@id”,DbType.String); l_objID.Value=strID; SQLiteParameter l_objContent=newsqliteparameter(“@new_content”,DbType.Binary); l_objContent.Value=lar_byBuffer; SQLiteParameter l_objChunk=新的SQLiteParameter(“@chunk”,DbType.Int32); SQLiteParameter l_objSize=新的SQLiteParameter(“@size”,DbType.Int32); SQLiteCommand l_objCommand=新的SQLiteCommand(l_strInsertQuery,l_objConnection); l_objCommand.Parameters.Add(l_objID); l_objCommand.Parameters.Add(l_objContent); l_objCommand.Parameters.Add(l_objChunk); l_objCommand.Parameters.Add(l_objSize); 整数l_i返回,l_lBytesRead; int l_iChunk=0;//当前“子块” int l_idbcunk=0;//数据库上的当前块 长l_lDBChunkLength=0;//块的当前长度 l_objChunk.Value=l_idbcunk; //交易 使用(SQLiteTransaction l_objTransaction=l_objConnection.BeginTransaction()) { //从流中读取文件 而((l_lBytesRead=objStream.Read(lar_byBuffer,0,lar_byBuffer.Length))>0) { //检查下一个区块 如果((l_lDBChunkLength+l_lBytesRead)>=SQLITE_MAX_BLOB_LENGTH) { l_objCommand.CommandText=l_strInsertQuery; l_iChunk=0;//重置“子块”计数器 l_lDBChunkLength=0;//重置块大小 l_idbcunk++;//增加块ID l_objChunk.Value=l_idbcunk; } l_lDBChunkLength+=l_lBytesRead;//增加块的长度 l_objContent.Size=l_lBytesRead;//内容字段的长度 l_objSize.Value=l_lBytesRead;//块长度(写入“大小”列) #区域写入 尝试 { l_iReturn=l_objCommand.ExecuteNonQuery(); 如果(l_iChunk==0) { l_objCommand.CommandText=l_strUpdateQuery; } } 捕获(例外情况除外) { l_objTransaction.Rollback(); 闭合连接(l_对象连接); string l_strMessage=string.Format(“文件{0}、DB chunk{1}、chunk{2}:\n{3}”、strID、l_idbcunk、l_iChunk、ex.Message上的SQLite异常); 抛出新的OfflineStorageException(l_strMessage,ex); } 如果(l_iReturn!=1) { l_objTransaction.Rollback(); 闭合连接(l_对象连接); string l_strMessage=string.Format(“文件{0}的DB chunk{1},chunk{2}未插入到DB上。”,strID,l_idbcunk,l_iChunk); 抛出新的OfflineStorageException(l_strMessage); } #端区写入 l_iChunk++; } l_objTransaction.Commit(); } l_objCommand.Dispose(); 闭合连接(l_对象连接); objStream.Position=l_lOldPosition; } },c#,sqlite,ado.net,system.data.sqlite,C#,Sqlite,Ado.net,System.data.sqlite,DB数据读取器扩展类: 公共静态类DbDataReaderExtension { 公共静态long-GetStream(此DbDataReader-objReader,System.IO.Stream-objStream,int-iIndex=0,long-lFileLength=-1) { const int CHUNK_SIZE=7*1024; byte[]lar_byBuffer=新字节[CHUNK_SIZE];//缓冲区 long l_lBytesRead;//从SQLite数据库列读取

DB数据读取器扩展类:

公共静态类DbDataReaderExtension
{
公共静态long-GetStream(此DbDataReader-objReader,System.IO.Stream-objStream,int-iIndex=0,long-lFileLength=-1)
{
const int CHUNK_SIZE=7*1024;
byte[]lar_byBuffer=新字节[CHUNK_SIZE];//缓冲区
long l_lBytesRead;//从SQLite数据库列读取的字节数
长l_lFieldOffset=0;//数据库列上的字段偏移量
长l_lBytesRemainig=l文件长度;
而((l_lBytesRead=objReader.GetBytes(iIndex,l_lFieldOffset,lar_byBuffer,0,lar_byBuffer.Length))>0)
{
l_lFieldOffset+=l_lBytesRead;//准备下一个偏移量
if(l_lBytesRemainig>0)//检查是否设置了文件长度
{
l_lBytesRemainig-=l_lBytesRead;//删除读取的字节
if(l_lBytesRemainig<0)//如果文件大于列大小,则剪切最后字节无效
l_lBytesRead+=l_lbytesreainig;
}
//只写有效字节
写入(lar_byBuffer,0,(int)l_lBytesRead);
}
返回lFileLength<0?l_lFieldOffset:lFileLength;
}
}
我发现生成此异常是因为ReadBytes方法(SQLiteDataReader)调用VerifyType

private-TypeAffinity-VerifyType(inti,DbType-typ)
{
CheckClosed();
CheckValidRow();
TypeAffinity affinity=GetSQLiteType(i).affinity;
开关(关联)
{
...        
案例类型关联。文本:
if(typ==DbType.SByte)返回affinity;
if(typ==DbType.String)返回affinity;
if(typ==DbType.SByte)返回affinity;
if(typ==DbType.Guid)返回affinity;
if(typ==DbType.DateTime)返回affinity;
if(typ==DbType.Decimal)返回affinity;
打破
case-TypeAffinity.Blob:
...
}
抛出新的InvalidCastException();
}
在此函数中,不希望typ等于DbType.Binary,affinity等于TypeAffinity.Text
有人能帮我理解这个问题吗?

谢谢

好的,下面是我如何添加和检索blob的

我想这完全取决于字节[]是否是可管理的大小。这适用于序列化到数据库的小对象

使用GetDataTable来创建ge
    public byte[] getByteArray(DataRow row, int offset)
    {
        object blob = row[offset];
        if (blob == null) return null;
        byte[] arData = (byte[])blob;
        return arData;
    }
    private System.Object syncLock = new System.Object();

    public int ExecuteNonQueryWithBlob(string sql, string blobFieldName, byte[] blob)
    {
        lock (syncLock)
        {
            try
            {
                using (var c = new SQLiteConnection(dbConnection))
                {
                    using (var cmd = new SQLiteCommand(sql, c))
                    {
                        cmd.Connection.Open();
                        cmd.Parameters.AddWithValue("@" + blobFieldName, blob);
                        return cmd.ExecuteNonQuery();
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return 0;
            }
        }
    }

    public DataTable GetDataTable(string sql)
    {
        lock (syncLock)
        {
            try
            {
                DataTable dt = new DataTable();
                using (var c = new SQLiteConnection(dbConnection))
                {
                    c.Open();
                    using (SQLiteCommand cmd = new SQLiteCommand(sql, c))
                    {
                        using (SQLiteDataReader rdr = cmd.ExecuteReader())
                        {
                            dt.Load(rdr);
                            return dt;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return null;
            }
        }
    }