-1

可能重复:
如何处理 Varbinary 和 asp.net 更新

嗨,这是我之前的问题的以下内容。

问题是当我试图更新由一个列表视图以 aspx 形式提交的 varbinary 时。每次我检索到相同的错误时:

I dati di tipo string o binary verrebbero troncati。L'istruzione è stata interrotta。所以字符串或二进制将被截断命令被中断。

我认为这是 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();
        }
    }

但是用这段代码每次都是一样的错误。

我控制了桌子,但一切都是正确的。

真的我不知道还需要做什么。

谢谢

皮尔卡洛

4

1 回答 1

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

并在选择和更新命令中使用它,如下所示:

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">

一切正常

皮尔卡洛

于 2012-09-24T16:27:46.350 回答