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

如果 items 是复杂对象,则在末尾添加 .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 错误时,这意味着您已尝试将一种类型分配给另一种类型。在您的情况下,我想您已尝试将文本框分配给字符串。文本框是一个对象。您需要从中选择值并转换该 ToString()。

例如,如果你想将你的文本框分配给一个字符串,它看起来像这样:

myString = Textbox1.Value.ToString();

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

于 2011-05-11T15:37:36.680 回答
1

我已经能够根据 Alexander 给出的建议解决这个问题。

请在下面找到正确的代码。

感谢 Alexander 和所有其他人特别为花费大量时间的 Abdul 提供的帮助。

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 回答
1

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

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

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

希望对其他人有所帮助!

于 2017-10-10T16:58:16.733 回答
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 回答
0

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

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

只需在 SQL 类型 TIME 或任何类型如 VARCHAR(8) 或 VARCHAR(需要长度) 中进行 CAST。

于 2021-01-28T03:39:28.143 回答