嗨,这是我上一个问题的以下内容。
问题是当我尝试以aspx格式更新由一个listview提交的varbinary时。 每次我检索到同样的错误:
我dati di tipo string o binary verrebbero troncati。 L'istruzioneèstatainterrotta。因此,字符串或二进制文件将被截断,命令被中断。
我认为这是asp.net的问题,我试图在服务器端使用c#拦截列表视图的事件ItemInserting,并使用以下代码:
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();
}
}
但是这个代码每次都是同样的错误。
我控制了桌子,但一切都是正确的。
我真的不知道还需要做些什么。
三江源
Piercarlo
答案 0 :(得分:0)
好的,我找到了以下解决方案: 我在sql server中创建了两个函数,在strinBase64中反转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
并在select和更新commad中使用它,如下所示:
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">
一切正常
Piercarlo