Ошибка: объект должен реализовывать IConvertible - PullRequest
4 голосов
/ 11 мая 2011

Я пытаюсь вставить элементы списка и значение текстового поля для каждого из элементов списка в базу данных, когда я получаю сообщение об ошибке ниже.

ЕСЛИ я пытаюсь вставить элементы списка только у меня успешно, но когда я пытаюсь вставить значение текстового поля, я получаю эту ошибку. Подскажите, пожалуйста, что я делаю не так.

Error Message: Object must implement IConvertible.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidCastException: Object must implement IConvertible.

Source Error:

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

c # CODE

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);
    }

Я хочу добавить все значения списка в базу данных.

Во-вторых, даже если я попытаюсь использовать.

SelectedItem

тогда я получаю следующую ошибку.

Insert Error: Incorrect syntax near 'CPD1'. 
Incorrect syntax near 'CPD'. 
Incorrect syntax near 'CPD2'. 
Incorrect syntax near 'CPD'. 
Incorrect syntax near 'CPD3'. 
Incorrect syntax near 'CPD'.

Есть идеи, где я иду не так?

Ответы [ 5 ]

6 голосов
/ 11 мая 2011

, если ваш список содержит только строковые элементы, вам нужно изменить следующую строку

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();
}
2 голосов
/ 11 мая 2011

Когда вы получаете ошибку IConvertable, это означает, что вы пытались присвоить один тип другому.В вашем случае я бы предположил, что вы пытались присвоить текстовое поле для строки.Текстовое поле является объектом.Вам нужно выбрать значение из него и преобразовать этот ToString ().

Например, если вы хотите присвоить текстовое поле строке, она будет выглядеть следующим образом:

myString = Textbox1.Value.ToString();

IConvertable - это неявный ToString (), который вы иногда можете использовать.Не все это реализовано.В вашем случае, для каждого элемента управления, который вы назначаете строке, убедитесь, что на выходе будет строка, которую вы хотите.Некоторые будут реализовывать ToString (), и это будет просто индикатор используемого вами элемента управления, а не значение, которое вы ожидаете.Посмотрите на каждый элемент и посмотрите, где хранятся данные, которые вы хотите (обычно в свойстве с именем Текст или Значение).Затем проверьте тип данных для этого вывода.

1 голос
/ 16 мая 2011

Мне удалось решить проблему, основываясь на совете Александра.

Пожалуйста, найдите правильный код ниже.

Спасибо за Александра и всех остальных за их помощь специально Абдулу, который провел много времени.

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);
    }

}
0 голосов
/ 10 октября 2017

Я хотел бы добавить это, потому что я столкнулся с этим сообщением об ошибке сегодня, но на самом деле оно просто маскировало более глубокую скрытую проблему.

Я работал с некоторыми обобщениями и отражениями, и после дальнейших копаний действительная ошибка была The type 'Microsoft.SqlServer.Types.SqlGeography' exists in both 'Microsoft.SqlServer.Types.dll' and 'Microsoft.SqlServer.Types.dll'.

Решение состояло в том, чтобы выровнять версии DLL, на которые ссылаются мое приложение и зависимость.Я сделал это, установив конкретную версию от Nuget, и проблема решена!Если это не вариант, вы можете использовать связывание перенаправлений, но я не пробовал.

Надеюсь, что это поможет кому-то еще!

0 голосов
/ 11 мая 2011

Вместо

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);

    }

Do

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);
...