Utilisez-vous SQL Server? Si oui, voir cette page pour le type de données SQL pour applications de type de données CLR: http://msdn.microsoft.com/en-us/library/cc716729.aspx
SQL Server char
, varchar
, nchar
et nvarchar
tous vers/à partir d'un string
C# (si un char[]
fonctionnera aussi bien). SQL Server binary and
varbinary map to/from a C#
octet [] `.
Quel est le problème réel que vous rencontrez? En outre, si vous transmettez des données binaires en tant que varchar à SQL Server, je m'attendrais à ce qu'il soit intégré dans la transformation entre UTF-16 (codage de chaîne interne CLR) et la page de code utilisée par SQL Server.
Une autre chose à noter: votre procédure stockée:
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
n'est pas SQL juridique. Convert()
est une fonction, pas une instruction SQL. Il ne compile même pas. Si vous essayez de convertir votre varchar
paramètre @profileImage
-varbinary
, vous allez devoir faire quelque chose le long des lignes de
declare @image varbinary(max)
set @image = convert(varbinary(max),@profileImage)
Si vous êtes procédure stockée a la signature
create procedure dbo.insertPlayerImage
@playerId varchar(9) ,
@profileImage varbinary(max) ,
@pending char(1)
as
...
Ensuite, ce code vous fera:
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 ;
}
cependant, si vous passez une null
pour les données d'image, vous devez modifier la définition de la valeur du paramètre.Quelque chose le long des lignes de:
command.Parameters.AddWithValue("@profileImage" , profileImage != null ? (object)profileImage : (object)DBNull.Value) ;
Ou
SqlParameter p = new SqlParameter("@profileImage" , SqlDbType.VarBinary) ;
p.Value = DBNull.Value ;
if (profileImage != null)
{
p.Value = profileImage ;
}
command.Parameters.Add(p) ;
Si vous devez ** stocker ** une valeur 'varbinary (max)' - ** pourquoi diable ** n'utilisez-vous pas un 'varbinary (max)' comme ** type de paramètre ** dans le premier endroit?!?!? –
dans ma base de données, le type de données est un varbinary max. Im essayant de permettre à un utilisateur de télécharger une image et l'enregistrer. tous les exemples de cela, lisez l'image à un tableau d'octets. mais quand j'ai essayé de passer mon tableau d'octets à mon proc stocké, il m'a donné l'erreur de conversion. donc j'ai changé le @profileImage pour être un varchar, et dans mon proc stocké j'allais le convertir du tableau d'octets (varchar) au varbinary. – dwarf
Oui - donc si c'est 'varbinary (max)' dans la base de données, alors le paramètre procédure stockée devrait aussi être 'varbinary (max)': '@profileImage varbinary (max)' - alors vous ** don ' J'ai besoin de ** conversions .... –