你使用SQL Server:
public DataTable ExecuteParameterizedStoredProcedureObjects(string procedureName, Dictionary<string, object> parameters)
{
var dataTable = new DataTable();
var _sqlConnection = new SqlConnection(_connectionString);
var cmd = new SqlCommand(procedureName, _sqlConnection);
cmd.CommandType = CommandType.StoredProcedure;
var da = new SqlDataAdapter(cmd);
foreach (var entry in parameters)
{
cmd.Parameters.Add(entry.Key, entry.Value);
}
try
{
_sqlConnection.Open();
da.Fill(dataTable);
}
catch (Exception ex)
{
var errorText = string.Format("Occ Repository ExecuteQuery Error : QueryString={0} :: Error={1}", procedureName, ex.Message);
throw new Exception(errorText, ex);
}
finally
{
da.Dispose();
_sqlConnection.Dispose();
}
return dataTable;
}
的東西,如打電話了嗎?如果是這樣,看到這個網頁的SQL數據類型CLR數據類型映射:http://msdn.microsoft.com/en-us/library/cc716729.aspx
SQL服務器char
,varchar
,nchar
和nvarchar
都映射到/從C#string
(雖然char[]
也能發揮作用)。
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) ;
如果你需要**存儲一個varbinary(max)值 - **爲什麼地球上**你沒有使用'varbinary(max)'作爲**參數類型**地點?!?!? –
在我的數據庫中,數據類型是varbinary max。即時通訊嘗試允許用戶上傳圖片並保存。所有的例子,讀取圖片到一個字節數組。但是當我試圖將我的字節數組傳遞給我存儲的proc時,它給了我轉換錯誤。所以我改變@profileImage是一個varchar,並且在我存儲的proc中,我將它從字節數組(varchar)轉換爲varbinary。 – dwarf
是的 - 所以如果它是數據庫中的varbinary(max),那麼存儲過程參數應該也是** varbinary(max)':'@profileImage varbinary(max)' - 那麼你**不要' t需要**任何轉換.... –