ASP.NET UPDATE中的SQL VARBINARY

时间:2012-09-24 15:12:45

标签: asp.net sql-server c#-4.0

  

可能重复:
  How handle Varbinary an asp.net update

嗨,这是我上一个问题的以下内容。

问题是当我尝试以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

1 个答案:

答案 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