2012-09-24 26 views
-1

Possible Duplicate:
How handle Varbinary an asp.net updateSQL VARBINARY在ASP.NET UPDATE

你好,这是我以前的问题如下。

问题是,当我尝试更新由aspx表单中的一个listview提交的varbinary。 每次我检索到相同的错误:

我大提琴弦字符串二进制verrebbero troncati。 L'istruzioneèstata interrotta。所以字符串或二进制将被截断命令被中断。

我tougth这是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

好吧,我发现,是继决议:我做了在SQL服务器的两个功能转换VARBINARY在strinBase64ê反之亦然这样我可以处理像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 

,并在选择和更新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