错误:对象必须实现IConvertible

时间:2011-05-11 15:32:09

标签: c# iconvertible

当我收到以下错误时,我试图将每个列表框项的列表框项和文本框值插入到数据库中。

如果我尝试插入列表框项目,我只是成功但是当我尝试插入文本框值时,我收到此错误。你能告诉我我做错了吗?

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'.

知道我哪里错了吗?

6 个答案:

答案 0 :(得分:6)

如果您的列表框仅包含字符串项,则需要更改后续行

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

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

如果项目是复杂的对象,则在末尾添加.ToString()

UPD:如果要添加所有ListBox项,则需要循环遍历其项集合并执行insert query foreach项,如下所示:

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

答案 1 :(得分:2)

当您收到IConvertable错误时,这意味着您已尝试将一种类型分配给另一种类型。在您的情况下,我会想象您已尝试将文本框分配给字符串。文本框是一个对象。您需要从中选择Value并转换ToString()。

例如,如果要将文本框分配给字符串,它将如下所示:

myString = Textbox1.Value.ToString();

IConvertable是您有时可以使用的隐式ToString()。并非一切都已实施。在您的情况下,对于要分配给字符串的每个控件,请验证输出将是您想要的字符串。有些将实现ToString(),它只是您正在使用的控件的指示器,而不是您期望的值。查看每个项目并查看所需数据的存储位置(通常位于名为Text或Value的属性中)。然后验证该输出的数据类型。

答案 2 :(得分: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);
    }

}

答案 3 :(得分: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);

答案 4 :(得分:0)

我想添加这个,因为我今天遇到了这个错误消息,但它实际上只是掩盖了一个更深层次的基础问题。

我正在处理一些泛型和反思,在进一步挖掘后,实际错误是The type 'Microsoft.SqlServer.Types.SqlGeography' exists in both 'Microsoft.SqlServer.Types.dll' and 'Microsoft.SqlServer.Types.dll'

解决方案是调整我的应用程序和依赖项之间引用的DLL的版本。我通过从Nuget安装特定版本来做到这一点,问题解决了!如果这不是一个选项,您可能可以使用绑定重定向,但我还没有尝试过。

希望能帮到别人!

答案 5 :(得分:0)

我知道这有点旧,但是,如果有人正在寻找它,我还有另一种解决方案。

DB 中的 TIME 列和选择查询,我收到了类似的错误。 对于模型,我使用字符串作为时间类型。

在 SQL 类型 TIME 或任何类型的 VARCHAR(8) 或 VARCHAR(需要长度)中简单地进行 CAST。