你在使用 SQL Server 吗?如果是这样,请参阅此页面以了解 SQL 数据类型到 CLR 数据类型的映射:http: //msdn.microsoft.com/en-us/library/cc716729.aspx
SQL Server char
, varchar
,nchar
和nvarchar
所有映射到/从 C# string
(虽然 achar[]
也可以工作)。
SQL Server binary and
varbinary map to/from a C#
byte[]`。
你遇到的实际问题是什么?
此外,如果您将二进制数据作为 varchar 传递给 SQL Server,我希望它能够在 UTF-16(CLR 内部字符串编码)到 SQL Server 使用的任何代码页之间的转换中得到修改。
另一件事要注意:您的存储过程:
ALTER PROCEDURE insertPlayerImage
@playerID varchar(9),
@profileImage varchar(max),
@pending char(1)
AS
CONVERT(varbinary(max), @profileImage)
INSERT INTO PlayerImage
( playerID , profileImage , pending )
VALUES
( @playerID , @profileImage , @pending )
GO
不是合法的 SQL。Convert()
是一个函数,而不是 SQL 语句。它甚至不编译。如果您尝试将varchar
参数转换@profileImage
为varbinary
,您将不得不按照以下方式进行操作
declare @image varbinary(max)
set @image = convert(varbinary(max),@profileImage)
如果你的存储过程有签名
create procedure dbo.insertPlayerImage
@playerId varchar(9) ,
@profileImage varbinary(max) ,
@pending char(1)
as
...
然后这段代码会帮你:
public int insertProfileImage( string playerId , byte[] profileImage , bool pending )
{
if ( string.IsNullOrWhiteSpace(playerId) ) throw new ArgumentException("playerId" ) ;
if ( profileImage == null || profileImage.Length < 1 ) throw new ArgumentException("profileImage") ;
int rowCount ;
string connectString = GetConnectString() ;
using ( SqlConnection connection = new SqlConnection(connectString) )
using ( SqlCommand command = connection.CreateCommand() )
{
command.CommandType = CommandType.StoredProcedure ;
command.CommandText = "dbo.insertPlayerImage" ;
command.Parameters.AddWithValue( "@playerId" , playerId ) ;
command.Parameters.AddWithValue( "@profileImage" , profileImage ) ;
command.Parameters.AddWithValue( "@pending" , pending ? "Y" : "N" ) ;
rowCount = command.ExecuteNonQuery() ;
}
return rowCount ;
}
但是,如果您要传递null
图像数据,则需要更改参数值的设置方式。类似于以下内容:
command.Parameters.AddWithValue( "@profileImage" , profileImage != null ? (object)profileImage : (object)DBNull.Value ) ;
或者
SqlParameter p = new SqlParameter( "@profileImage" , SqlDbType.VarBinary ) ;
p.Value = DBNull.Value ;
if ( profileImage != null )
{
p.Value = profileImage ;
}
command.Parameters.Add( p ) ;