一个参数化更新语句传入类型错误问题
今天发现了一个很怪的错误提示,经过检查,发现主要原因是因为一个字段在存储xml时过长引起的。数据库使用varchar(max)
The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Too many parameters were provided in this RPC request. The maximum
sqlPara[paraindex] = new SqlParameter(); sqlPara[paraindex].ParameterName = "@BeiZhu"; sqlPara[paraindex].SqlDbType = SqlDbType.Varchar; sqlPara[paraindex].Direction = ParameterDirection.Input; sqlPara[paraindex].Value = p_model.TiaoJianZiDuan; paraindex++;
注意红色部分,如果使用SqlDbType.Varchar,会最多只允许写入4000个中文字符而报错(注意这个时候不是报截断错误)
如果想用
SqlDbType.Varchar
可以增加下面代码解决问题
sqlPara[paraindex].Size = -1;
另外直接使用
SqlDbType.Text
也可以,
SqlDbType与DbType的转换关系
SqlDbType => DbType
SqlDbType.BigInt DbType.Int64
SqlDbType.Binary DbType.Binary
SqlDbType.Bit DbType.Boolean
SqlDbType.Char DbType.AnsiStringFixedLength
SqlDbType.DateTime DbType.DateTime
SqlDbType.Decimal DbType.Decimal
SqlDbType.Float DbType.Double
SqlDbType.Image DbType.Binary
SqlDbType.Int DbType.Int32
SqlDbType.Money DbType.Currency
SqlDbType.NChar DbType.StringFixedLength
SqlDbType.NText DbType.String
SqlDbType.NVarChar DbType.String
SqlDbType.Real DbType.Single
SqlDbType.UniqueIdentifier DbType.Guid
SqlDbType.SmallDateTime DbType.DateTime
SqlDbType.SmallInt DbType.Int16
SqlDbType.SmallMoney DbType.Currency
SqlDbType.Text DbType.AnsiString
SqlDbType.Timestamp DbType.Binary
SqlDbType.TinyInt DbType.Byte
SqlDbType.VarBinary DbType.Binary
SqlDbType.VarChar DbType.AnsiString
SqlDbType.Variant DbType.Object
SqlDbType.Xml DbType.Xml
SqlDbType.Udt DbType.Object
SqlDbType.Structured DbType.Object
SqlDbType.Date DbType.Date
SqlDbType.Time DbType.Time
SqlDbType.DateTime2 DbType.DateTime2
SqlDbType.DateTimeOffset DbType.DateTimeOffset
DbType => SqlDbType
DbType.AnsiString SqlDbType.VarChar
DbType.Binary SqlDbType.VarBinary
DbType.Byte SqlDbType.TinyInt
DbType.Boolean SqlDbType.Bit
DbType.Currency SqlDbType.Money
DbType.Date SqlDbType.DateTime
DbType.DateTime SqlDbType.DateTime
DbType.Decimal SqlDbType.Decimal
DbType.Double SqlDbType.Float
DbType.Guid SqlDbType.UniqueIdentifier
DbType.Int16 SqlDbType.SmallInt
DbType.Int32 SqlDbType.Int
DbType.Int64 SqlDbType.BigInt
DbType.Object SqlDbType.Variant
DbType.SByte (抛异常)
DbType.Single SqlDbType.Real
DbType.String SqlDbType.NVarChar
DbType.Time SqlDbType.DateTime
DbType.UInt16 (抛异常)
DbType.UInt32 (抛异常)
DbType.UInt64 (抛异常)
DbType.VarNumeric (抛异常)
DbType.AnsiStringFixedLength SqlDbType.Char
DbType.StringFixedLen
另外注意:
当 LOB 数据足够小时,可以考虑将数据直接存储在数据行(行所在的数据页面)中,从而可以避免额外的读取 LOB 页面,提升访问 LOB 数据的效率(将 LOB 数据直接存储在数据页面的阈值由 text in row 选项设置)。
而当 LOB 数据大于此阈值,或者所在行的大小超过了 8060 字节(单行最大 SIZE),LOB 数据将会存储在 LOB 页面,而在数据页面中保留一个指向 LOB 页面的 16 字节的指针。其访问效率当然会将低。
另外建了几个QQ技术群:
2、全栈技术群:616945527
2、硬件嵌入式开发: 75764412
3、Go语言交流群:9924600
闲置域名WWW.EXAI.CN (超级人工智能)出售。