4

以下のエラーが発生したときに、リストボックス項目と各リストボックス項目のテキストボックス値をデータベースに挿入しようとしています。

リストボックスの項目のみを挿入しようとすると成功しますが、テキストボックスの値を挿入しようとすると、このエラーが発生します。私が間違っていることを教えてください。

エラー メッセージ: オブジェクトは IConvertible を実装する必要があります。
説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.InvalidCastException: オブジェクトは IConvertible を実装する必要があります。

ソース エラー:

60 行目:
61 行目:             
62 行目: cmd.ExecuteNonQuery();
63 行目:
64 行目:

c#コード

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Specialized;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Data.SqlClient;
using System.Web.UI.HtmlControls;

public partial class test1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    private string GetConnectionString()
    {

        return System.Configuration.ConfigurationManager.ConnectionStrings["RM_Jan2011ConnectionString"].ConnectionString;

    }

    private void InsertRecords(StringCollection sc)
    {

        SqlConnection conn = new SqlConnection(GetConnectionString());

        StringBuilder sb = new StringBuilder(string.Empty);


        foreach (string item in sc)
        {
            const string sqlStatement = "INSERT INTO FileID(File_Code, Dept_Code) VALUES(@File_Code, @Dept_Code)";

            sb.AppendFormat("{0}('{1}'); ", sqlStatement, item);

        }

        try
        {
            conn.Open();

            SqlCommand cmd = new SqlCommand(sb.ToString(), conn);



           cmd.Parameters.Add("@File_Code", SqlDbType.VarChar);
        cmd.Parameters["@File_Code"].Value = ListBox2.Items;


        cmd.Parameters.Add("@Dept_Code", SqlDbType.VarChar);
        cmd.Parameters["@Dept_Code"].Value = DropDownList1.Text;



            cmd.ExecuteNonQuery();


            Page.ClientScript.RegisterClientScriptBlock(typeof(Page), "Script", "alert ('Records Successfuly Saved!');", true);
        }


        catch (System.Data.SqlClient.SqlException ex)
        {
            string msg = "Insert Error:";

            msg += ex.Message;

            throw new Exception(msg);
        }
        finally
        {
            conn.Close();
        }
    }


    protected void Button4_Click(object sender, EventArgs e)
    {

        int myint = Convert.ToInt32(TextBox1.Text) + 1;

        for (int i = 1; i < myint; i++)
        {
            ListBox2.Items.Add(DropDownList1.SelectedItem.ToString() + i.ToString());

        }
    }

    protected void Button1_Click(object sender, EventArgs e)
    {

        StringCollection sc = new StringCollection();

        foreach (ListItem item in ListBox2.Items)
        {
            {
                sc.Add(item.Text);
                sc.Add(DropDownList1.Text);
            }
        }
        InsertRecords(sc);
    }

リストボックスのすべての値をデータベースに追加したい。

第二に、私が使用しようとしても。

選択した項目

次に、次のエラーが表示されます。

挿入エラー: 'CPD1' 付近の構文が正しくありません。
「CPD」付近の構文が正しくありません。
「CPD2」付近の構文が正しくありません。
「CPD」付近の構文が正しくありません。
「CPD3」付近の構文が正しくありません。
「CPD」付近の構文が正しくありません。

私が間違っているところはありますか?

4

6 に答える 6

6

リストボックスに文字列項目のみが含まれている場合は、次の行を変更する必要があります

cmd.Parameters["@File_Code"].Value = ListBox2.Items

cmd.Parameters["@File_Code"].Value = ListBox2.SelectedItem

項目が複雑なオブジェクトの場合は、最後に .ToString() を追加します

UPD: すべての ListBox アイテムを追加する場合は、そのアイテム コレクションをループして、アイテムごとに挿入クエリを実行する必要があります。次のようになります。

foreach(string item in ListBox2.Items)
{
    SqlCommand cmd = new SqlCommand(sqlStatement, conn);       
    cmd.Parameters.Add("@File_Code", SqlDbType.VarChar);    
    cmd.Parameters["@File_Code"].Value = item;    
    cmd.Parameters.Add("@Dept_Code", SqlDbType.VarChar);    
    cmd.Parameters["@Dept_Code"].Value = DropDownList1.Text;        
    cmd.ExecuteNonQuery();
}
于 2011-05-11T15:44:26.723 に答える
3

IConvertable エラーが発生した場合は、ある型を別の型に割り当てようとしたことを意味します。あなたの場合、テキストボックスを文字列に割り当てようとしたと思います。Textbox はオブジェクトです。その中から値を選択し、その ToString() を変換する必要があります。

たとえば、テキスト ボックスを文字列に割り当てたい場合は、次のようになります。

myString = Textbox1.Value.ToString();

IConvertable は、時々使用できる暗黙の ToString() です。すべてが実装されているわけではありません。あなたの場合、文字列に割り当てるコントロールごとに、出力が目的の文字列になることを確認します。ToString() を実装するものもありますが、これは、期待する値ではなく、使用しているコントロールの指標にすぎません。各項目を見て、必要なデータが保存されている場所を確認します (通常は、Text または Value というプロパティ内)。次に、その出力のデータ型を確認します。

于 2011-05-11T15:37:36.680 に答える
1

アレクサンダーからのアドバイスに基づいて問題を解決できました。

以下の正しいコードを見つけてください。

多くの時間を費やしたアブドゥルに特に助けてくれたアレクサンダーと他のすべての人に感謝します。

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Specialized;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Data.SqlClient;
using System.Web.UI.HtmlControls;

public partial class FileIDmasterWorking : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void Button4_Click(object sender, EventArgs e)
    {
        int myint = Convert.ToInt32(TextBox1.Text) + 1;

        for (int i = 1; i < myint; i++)
        {
            Convert.ToString(ListBox2.Items);

            ListBox2.Items.Add(DropDownList1.SelectedItem.ToString() + i.ToString());

        }
    }

    private string GetConnectionString()
    {
        return     System.Configuration.ConfigurationManager.ConnectionStrings["RM_Jan2011ConnectionString"].ConnectionString;
    }

    private void InsertRecords(StringCollection sc)
    {
        SqlConnection conn = new SqlConnection(GetConnectionString());

        StringBuilder sb = new StringBuilder(string.Empty);

        **foreach (ListItem item in ListBox2.Items)
        {
            const string sqlStatement = "INSERT INTO FileID(File_Code, Dept_Code) VALUES(@File_Code, @Dept_Code)";
            sb.AppendFormat("{0}('{1}'); ", sqlStatement, item);
            SqlCommand cmd = new SqlCommand(sqlStatement, conn);
            cmd.Parameters.Add("@File_Code", SqlDbType.VarChar);
            cmd.Parameters["@File_Code"].Value = item.ToString();
            cmd.Parameters.Add("@Dept_Code", SqlDbType.VarChar);
            cmd.Parameters["@Dept_Code"].Value = DropDownList1.Text;
            conn.Open();
            cmd.ExecuteNonQuery();**

            Page.ClientScript.RegisterClientScriptBlock(typeof(Page), "Script", "alert('Records Successfuly Saved!');", true);

            conn.Close();
        }
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        StringCollection sc = new StringCollection();

        foreach (ListItem item in ListBox2.Items)
        {
            {
                sc.Add(item.Text);
            }
        }

        InsertRecords(sc);
    }

}
于 2011-05-16T14:33:04.823 に答える
0

それ以外の

cmd.Parameters["@File_Code"].Value = ListBox2.Items;

やってみる

cmd.Parameters["@File_Code"].Value = ListBox2.SelectedItem.Text;

ListBox.Items はコレクションであり、値のグループではなく特定の値が必要です。

不正なコード

foreach (string item in sc)
    {
        const string sqlStatement = "INSERT INTO FileID(File_Code, Dept_Code) VALUES(@File_Code, @Dept_Code)";

        sb.AppendFormat("{0}('{1}'); ", sqlStatement, item);

    }

行う

string sqlStatement = string.Empty; 
foreach (string item in sc)
    {
        sqlStatement = "INSERT INTO FileID(File_Code, Dept_Code) VALUES({0}, {1})";

      sqlStatement = string.Format(sqlStatement, fileCodeVar, deptCodeVar);//let fileCodeVar is a variable containing fileCode and DeptCodeVar is a variable containing DeptCode

    }

交換

SqlCommand cmd = new SqlCommand(sb.ToString(), conn);

 SqlCommand cmd = new SqlCommand(sqlStatement, conn);
于 2011-05-11T15:46:52.147 に答える