可能的重复项:
如何处理 Varbinary asp.net 更新
嗨,这是我上一个问题的以下问题。
问题是当我尝试以 aspx 形式更新一个列表视图提交的 varbinary 时。每次我检索相同的错误时:
I dati di tipo string o binary verrebbero troncati.L'istruzione è stata interrotta.因此,字符串或二进制将被截断,命令被中断。
我认为这是 asp.net 的问题,我尝试在服务器端使用 c# 拦截事件 Item使用以下代码插入列表视图
:RunSqlCommand 是我在代码底部制作的一个类:
protected void ListView1_ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
IOrderedDictionary NuoviValori = e.NewValues;
Label CodiceArticolo = (Label)ListView1.Items[e.ItemIndex].FindControl("CODICE_ARTICOLOLabel1");
string Descrizione = "";
string UM = "";
string Foto = "";
string TipoArt = "";
foreach (DictionaryEntry entry in NuoviValori)
{
switch (entry.Key.ToString())
{
case "DESCRIZIONE":
Descrizione = entry.Value.ToString();
break;
case "UM":
UM = entry.Value.ToString();
break;
case "FOTO":
if (entry.Value == null)
{
Foto = EncodeTo64("ADBC");
}
else
{
Foto = entry.Value.ToString();
}
break;
case "TIPO_ART":
TipoArt = entry.Value.ToString();
break;
}
}
e.Cancel = true;
string strCmd = "UPDATE TBL_ARTICOLI SET DESCRIZIONE = '" + Descrizione +"'," +
"UM = '" + UM +"'," +
"FOTO = @Foto," +
"TIPO_ART = '" + TipoArt + "' " +
"WHERE CODICE_ARTICOLO = '" + CodiceArticolo.Text + "'";
RunSqlCommand.Parametro parametro = new RunSqlCommand.Parametro();
parametro.Name = "Foto";
parametro.Tipo = SqlDbType.VarBinary;
parametro.Value = Convert.FromBase64String(Foto);
RunSqlCommand.Parametro[] Parametri = new RunSqlCommand.Parametro[1];
Parametri[0] = parametro;
string retCmd = new RunSqlCommand().RunSqlCmdParamDeltaSSL(strCmd, Parametri);
ListView1.EditIndex = -1;
}
static public string EncodeTo64(string toEncode)
{
byte[] toEncodeAsBytes
= System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
string returnValue
= System.Convert.ToBase64String(toEncodeAsBytes);
return returnValue;
}
public struct Parametro
{
public SqlDbType Tipo;
public object Value;
public string Name;
}
public string RunSqlCmdParamDeltaSSL(string Command, Parametro[] Parameters)
{
int NumeroAffetto;
Connection ConnString = new Connection();
SqlConnection Conn = new SqlConnection();
Conn.ConnectionString = ConnString.ConnectDeltaSSL();
SqlCommand Comando = new SqlCommand(Command, Conn);
foreach (Parametro param in Parameters)
{
SqlParameter picparameter = new SqlParameter();
picparameter.SqlDbType = param.Tipo;
picparameter.ParameterName = param.Name;
picparameter.Value = param.Value;
Comando.Parameters.Add(picparameter);
}
Comando.CommandType = System.Data.CommandType.Text;
try
{
Comando.Connection.Open();
NumeroAffetto = Comando.ExecuteNonQuery();
return NumeroAffetto.ToString();
}
catch (Exception ex)
{
return ex.Message;
}
finally
{
Comando.Connection.Close();
}
}
但是用这段代码每次都是相同的错误。
我控制了桌子,但一切都是正确的。
真的我不知道还需要做什么。
谢谢
皮尔卡洛
我找到了以下解决方案:我在sql服务器中做了两个函数,在strinBase64 e viceversa中转换varbinary,这样我就可以像 asp.net 中的字符串一样处理数据:
ALTER FUNCTION dbo.FUN_BASE64_TO_VARBINARY
(
@str VARCHAR(MAX)
)
RETURNS varbinary(max)
AS
BEGIN
RETURN cast(N'' as xml).value('xs:base64Binary(sql:variable("@str"))', 'varbinary(max)');
END
ALTER FUNCTION dbo.FUN_BINARY_TO_BASE64
(
@bin varbinary(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
return cast(N'' as xml).value('xs:base64Binary(xs:hexBinary(sql:variable("@bin")))', 'varchar(max)');
END
并在选择和更新通信中使用它,如下所示:
SelectCommand="SELECT CODICE_ARTICOLO, DESCRIZIONE, UM, dbo.FUN_BINARY_TO_BASE64(FOTO) AS FOTO, TIPO_ART FROM TBL_ARTICOLI
WHERE (SUBSTRING(CODICE_ARTICOLO, 1, CHARINDEX('*', CODICE_ARTICOLO) - 1) = @CATEGORIA_ARTICOLO)"
UpdateCommand="UPDATE [TBL_ARTICOLI] SET [DESCRIZIONE] = @DESCRIZIONE, [UM] = @UM, [FOTO] = dbo.FUN_BASE64_TO_VARBINARY(@FOTO), [TIPO_ART] = @TIPO_ART WHERE [CODICE_ARTICOLO] = @CODICE_ARTICOLO">
一切正常
皮尔卡洛