none
有辦法將一個NameValueCollection object存入Table中嗎? RRS feed

  • 問題

  • 環境:Win2003 + SQL Server 2005 + VS 2005

     

    小弟想將一個NameValueCollection object存入Table中,已經建立了一個type為sql_variant的column,但以下的程式會出錯:

    程式碼區塊

    NameValueCollection SearchOptions = new NameValueCollection();

     

    //...

     

    SqlCommand cmdAddCustomExamLog = conn.CreateCommand();
    cmdAddCustomExamLog.Transaction = trans;
    cmdAddCustomExamLog.CommandText = "INSERT INTO TableA (UserId, Name, SearchOptions) VALUES (@UserId, @Name, @SearchOptions); SELECT SCOPE_IDENTITY() AS TableANo";
    cmdAddCustomExamLog.Parameters.Add(new SqlParameter("@UserId", UserId));
    cmdAddCustomExamLog.Parameters.Add(new SqlParameter("@Name", "自訂" + DateTime.Now.ToString("yyyyMMddHHmss")));
    cmdAddCustomExamLog.Parameters.Add(new SqlParameter("@SearchOptions", SearchOptions);

    CustomExamLogNo = Convert.ToInt32(cmdAddCustomExamLog.ExecuteScalar());

     

     

    錯誤為

    錯誤訊息

    DbType System.Collection.Specialized.NameValueCollection 與已知的管理提供者型別之間並無對應。

     

    請問NameValueCollection object存入Table可行嗎?如果可以,要怎麼修改呢?
    2007年12月19日 上午 01:41

解答

  • 用 XML 來存比較好吧。

     

    程式碼區塊

    <SearchOptions>

       <Option Key="..." Value="... />

       <Option Key="..." Value="... />

       <Option Key="..." Value="... />

       <Option Key="..." Value="... />

       <Option Key="..." Value="... />

    </SearchOptions>

     

     

     

    2007年12月19日 上午 02:08
    版主

所有回覆

  • 參考一下下列作法:

    serialize and store object in db

    2007年12月19日 上午 02:07
    版主
  • 用 XML 來存比較好吧。

     

    程式碼區塊

    <SearchOptions>

       <Option Key="..." Value="... />

       <Option Key="..." Value="... />

       <Option Key="..." Value="... />

       <Option Key="..." Value="... />

       <Option Key="..." Value="... />

    </SearchOptions>

     

     

     

    2007年12月19日 上午 02:08
    版主
  • HI,

     

    您可以利用BinaryFormatter將NameValueCollection經過序列化處理後轉成byte陣列, 再儲存到SQL SERVER的image型態的欄位

     

    tihs

    2007年12月19日 上午 02:13
  • 小弟參考這篇寫了兩個function:

    程式碼區塊

    public static string SoapSerialize(object obj)
    {
        string Result = null;

        using (MemoryStream s = new MemoryStream())
        {
            SoapFormatter formatter = new SoapFormatter();

            formatter.Serialize(s, obj);

            using (StreamReader sr = new StreamReader(s))
            {
                s.Position = 0;
                Result = sr.ReadToEnd();
                sr.Close();
            }
            s.Close();
        }

        return Result;
    }

     

    public static object SoapDeserialize(string SoapString)
    {
        object result = null;

        using (MemoryStream s = new MemoryStream())
        {
            using (StreamWriter sw = new StreamWriter(s))
            {
                sw.Write(SoapString);
                s.Position = 0;         //將目前位置重設到開頭,不然會錯誤。

                SoapFormatter formatter = new SoapFormatter();
                result = formatter.Deserialize(s);
               
                sw.Close();
            }

            s.Close();
        }

        return result;
    }

     

     

    請問SoapDeserialize(string SoapString)有哪裡有問題嗎?

    因為雖然存入資料庫時OK,但是取回作Deserialize時會出現

    錯誤訊息
    當剖析檔案 Name 時出現未預期的結尾。 第 227 行,位置 11

     

     

    以下是那附近的Soap Code (222~230行,紅色的是227行):

    Soap Code

    <SOAP-ENC:Array id="ref-67" SOAP-ENC:arrayType="xsd:anyType[1]">
    <item id="ref-85" xsi:type="SOAP-ENC:string">全部</item>
    </SOAP-ENC:Array>
    <SOAP-ENC:Array id="ref-68" SOAP-ENC:arrayType="xsd:anyType[1]">
    <item id="ref-86" xsi:type="SOAP-ENC:string">全部</item>
    </SOAP-ENC:Array>
    <SOAP-ENC:Array id="ref-69" SOAP-ENC:arrayType="xsd:anyType[1]">
    <item href="#ref-86"/>
    </SOAP-ENC:Array>

     

     

    看不出有甚麼問題...

    2007年12月19日 上午 06:12
  • 紅色跟藍色行不一樣,所以造成錯誤?

    程式碼區塊

    <SOAP-ENC:Array id="ref-67" SOAP-ENC:arrayType="xsd:anyType[1]">
    <item id="ref-85" xsi:type="SOAP-ENC:string">全部</item>
    </SOAP-ENC:Array>
    <SOAP-ENC:Array id="ref-68" SOAP-ENC:arrayType="xsd:anyType[1]">
    <item id="ref-86" xsi:type="SOAP-ENC:string">全部</item>
    </SOAP-ENC:Array>
    <SOAP-ENC:Array id="ref-69" SOAP-ENC:arrayType="xsd:anyType[1]">
    <item href="#ref-86"/>

    </SOAP-ENC:Array>

     

     

    2007年12月19日 上午 07:15
    版主
  •  LOLOTA 寫信:

    紅色跟藍色行不一樣,所以造成錯誤?

    程式碼區塊

    <SOAP-ENC:Array id="ref-67" SOAP-ENC:arrayType="xsd:anyType[1]">
    <item id="ref-85" xsi:type="SOAP-ENC:string">全部</item>
    </SOAP-ENC:Array>
    <SOAP-ENC:Array id="ref-68" SOAP-ENC:arrayType="xsd:anyType[1]">
    <item id="ref-86" xsi:type="SOAP-ENC:string">全部</item>
    </SOAP-ENC:Array>
    <SOAP-ENC:Array id="ref-69" SOAP-ENC:arrayType="xsd:anyType[1]">
    <item href="#ref-86"/>

    </SOAP-ENC:Array>

     

     

     

    可是這些值是SoapSerialize()產生的,接著就存入DB了。

    如果程式產生的也會錯,那我還真的不知道要怎麼解決。

    2007年12月19日 上午 07:21
  • 我序列化的做法...參考看看...

     

    NameValueCollection nvc = new NameValueCollection();
    nvc.Add("name1", "value1");
    
    SoapFormatter sf = new SoapFormatter();
    MemoryStream ms = new MemoryStream();
    sf.Serialize(ms, nvc);
    string strSOAP = Encoding.Default.GetString(ms.ToArray());
    
    MessageBox.Show(strSOAP);
    
    2007年12月19日 下午 04:59
  •  chhuang 寫信:

    我序列化的做法...參考看看...

    (恕刪)

    sf.Serialize(ms, nvc);

    string strSOAP = Encoding.Default.GetString(ms.ToArray());

    請問一下,為什麼需要Encoding.Default.GetString(ms.ToArray())呢?sf.Serialize(ms, nvc)出來的不是就已經是UTF-8的字串了嗎?
    2007年12月24日 上午 06:12