System.InvalidCastException:'指定的强制转换无效。' [英] System.InvalidCastException: 'Specified cast is not valid.'

查看:82
本文介绍了System.InvalidCastException:'指定的强制转换无效。'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好我在2017年Visual Studio社区中创建了一个IT库应用程序,代码在asp.net / C#中。当我将数据提交到SQL表时,我收到此错误 

Hi i am creating a IT Inventory application in visual studio community 2017 , the code is in asp.net / C#. When i submit the data to the SQL table i received this error 

System.InvalidCastException:'指定的强制转换无效。'

我的sql表查询是:

CREATE TABLE [dbo]。[工作站](

[Emp_Id] [int] IDENTITY(1,1)NOT NULL,

[Emp_Name] [varchar](30)NOT NULL,

[Emp_Surname] [varchar](30)NOT NULL,

[部门] [varchar](50)NOT NULL,

[Company] [varchar](30)NOT NULL,

[Hostname] [ nvarchar](20)NOT NULL,

[Wkst_Status] [varchar](15)NOT NULL,

[Make] [varchar](12)NOT NULL,

[型号] [varchar](15)NOT NUL L,

[SerialNumber] [nvarchar](30)NOT NULL,

[ProductNumber] [nvarchar](30)NOT NULL,

[Purch_Date ] [date] NOT NULL,

[WExpiry_Date] [date] NOT NULL,

[Memory] ​​[nvarchar](6)NOT NULL,

[Processor] [nvarchar](10)NOT NULL,

[HDD] [nvarchar](10)NOT NULL,

[OS] [nvarchar](25)NOT NULL,

  CONSTRAINT [PK__Workstat__262359ABF6F5A9AA] PRIMARY KEY CLUSTERED 



[Emp_Id] ASC

)WITH( PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)ON [PRIMARY]

)ON [PRIMARY]

GO

CREATE TABLE [dbo].[Workstations](
[Emp_Id] [int] IDENTITY(1,1) NOT NULL,
[Emp_Name] [varchar](30) NOT NULL,
[Emp_Surname] [varchar](30) NOT NULL,
[Department] [varchar](50) NOT NULL,
[Company] [varchar](30) NOT NULL,
[Hostname] [nvarchar](20) NOT NULL,
[Wkst_Status] [varchar](15) NOT NULL,
[Make] [varchar](12) NOT NULL,
[Model] [varchar](15) NOT NULL,
[SerialNumber] [nvarchar](30) NOT NULL,
[ProductNumber] [nvarchar](30) NOT NULL,
[Purch_Date] [date] NOT NULL,
[WExpiry_Date] [date] NOT NULL,
[Memory] [nvarchar](6) NOT NULL,
[Processor] [nvarchar](10) NOT NULL,
[HDD] [nvarchar](10) NOT NULL,
[OS] [nvarchar](25) NOT NULL,
 CONSTRAINT [PK__Workstat__262359ABF6F5A9AA] PRIMARY KEY CLUSTERED 
(
[Emp_Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

我的C#代码 ,错误出现在   if((bool)item [" Wkst_Status"])

使用System;

使用System.Collections.Generic;

使用System.ComponentModel;

使用System.Data ;

使用System.Data.SqlClient;

使用System.Drawing;

使用System.Linq;

使用System.Text;
$
使用System.Threading.Tasks;

使用System.Windows.Forms;

使用System.Configuration;



$
$ b命名空间库存数据库$
{

  ;  公共部分班级工作站:表格

    {

  &NBSP; &NBSP; &NBSP;私有IEnumerable< object>查询;



  &NBSP; &NBSP; &NBSP;公共对象WExpiry_Date {get;私人集; }


  &NBSP; &NBSP; &NBSP;公共工作站()

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; InitializeComponent();

  &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; private void label1_Click(object sender,EventArgs e)

  &NBSP; &NBSP; &NBSP; {

$
  &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; private void label1_Click_1(object sender,EventArgs e)

  &NBSP; &NBSP; &NBSP; {

$
  &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; private void Workstations_Load(object sender,EventArgs e)

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; // TODO:这行代码将数据加载到'iTInventoryDataSet.Workstations'表中。您可以根据需要移动或移除它。

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; //this.workstationsTableAdapter.Fill(this.iTInventoryDataSet.Workstations);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; comboBox3.SelectedIndex = 0;

  &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; private void button1_Click(object sender,EventArgs e)

  &NBSP; &NBSP; &NBSP; {

$
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; SqlConnection con = new SqlConnection(@"Data Source = sh-jasonk \ dev; Initial Catalog = ITInventory; Integrated Security = True");

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; //插入逻辑

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; con.Open();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; bool Wkst_Status = false;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; if(comboBox3.SelectedIndex == 0)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; Wkst_Status = true;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;否则

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; Wkst_Status = false;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; SqlCommand cmd = new SqlCommand



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; (@"INSERT INTO [dbo]。[工作站]

      (

     &NBSP;&NBSP; [EMP_NAME]

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; [Emp_Surname]

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;,[部门]

      ,[Company]

      , [主机名]

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; [Wkst_Status]

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;,[使]¥b $ b      ,[Model]

      ,[SerialNumber] <登记/>
&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; [ProductNumber]

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; [Purch_Date]

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; [WExpiry_Date]

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;,[存储器]

      ,[Processor]

& NBSP; &NBSP; &NBSP; &NBSP; &NBSP;  ,[HDD]

  &NBSP; &NBSP; &NBSP; &NBSP;  ,[OS])



  &NBSP;   VALUES

  &NBSP; &NBSP; &NBSP; &NBSP;  ('" + txtName.Text +"','" + txtSurname.Text +"','" + comboBox1.Text +"','" + comboBox2.Text +"' ,'" + txtHostName.Text +"','"
+ comboBox3.SelectedIndex +"','" + txtMake.Text +"','" + txtModel.Text +" ;','" + txtSN.Text +"','" + txtPN.Text +"','" + dateTimePicker1.Value.ToString(" yyyy / MM / dd")
+"','" + dateTimePicker1.Value.ToString(" yyyy / MM / dd")+"','" + txtMem.Text +"','" + txtProc.Text +" ;','" + txtHDD.Text +"','" + txtOS.Text +"')",con);
$




  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; //此处转换失败

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; cmd.ExecuteNonQuery();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; con.Close();



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; //阅读数据

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; SqlDataAdapter sda = new SqlDataAdapter(@" Select  [Emp_Name],[Emp_Surname],[Department],[Company],[Hostname],[Wkst_Status],[Make],[Model]

                          &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; [的SerialNumber],[ProductNumber],[Purch_Date],[WExpiry_Date],[存储器],[处理器],[HDD]

&NBSP;                                ,[OS] From [dbo]。[Workstations]",con);



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; DataTable dt = new DataTable();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; sda.Fill(dt);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows.Clear();



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; foreach(dt.Rows中的DataRow项目)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; int n = dataGridView1.Rows.Add();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows [n] .Cells [0] .Value = item [" Emp_Name"]。ToString();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows [n] .Cells [1] .Value = item [" Emp_Surname"]。ToString();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows [n] .Cells [2] .Value = item [" Department"]。ToString();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows [n] .Cells [3] .Value = item [" Company"]。ToString();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows [n] .Cells [4] .Value = item [" Hostname"]。ToString();



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; if((bool)item [" Wkst_Status"])



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows [n] .Cells [5] .Value =" Active"; $
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;否则

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows [n] .Cells [5] .Value =" Inactive";

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows [n] .Cells [6] .Value = item [" Make"]。ToString();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows [n] .Cells [7] .Value = item [" Model"]。ToString();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows [n] .Cells [8] .Value = item [" SerialNumber"]。ToString();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows [n] .Cells [9] .Value = item [" ProductNumber"]。ToString();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows [n] .Cells [10] .Value = item [" Purch_Date"]。ToString();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows [n] .Cells [11] .Value = item [" WExpiry_Date"]。ToString();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows [n] .Cells [12] .Value = item [" Memory"]。ToString();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows [n] .Cells [13] .Value = item [" Processor"]。ToString();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows [n] .Cells [14] .Value = item [" HDD"]。ToString();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; dataGridView1.Rows [n] .Cells [15] .Value = item [" OS"]。ToString();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; private void label17_Click(object sender,EventArgs e)

  &NBSP; &NBSP; &NBSP; {

$
  &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Configuration;



namespace InventoryStock
{
    public partial class Workstations : Form
    {
        private IEnumerable<object> query;

        public object WExpiry_Date { get; private set; }

        public Workstations()
        {
            InitializeComponent();
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void label1_Click_1(object sender, EventArgs e)
        {

        }

        private void Workstations_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'iTInventoryDataSet.Workstations' table. You can move, or remove it, as needed.
            //this.workstationsTableAdapter.Fill(this.iTInventoryDataSet.Workstations);
            comboBox3.SelectedIndex = 0;
        }

        private void button1_Click(object sender, EventArgs e)
        {

            SqlConnection con = new SqlConnection(@"Data Source=sh-jasonk\dev;Initial Catalog=ITInventory;Integrated Security=True");
            //Insert Logic
            con.Open();
            bool Wkst_Status = false;
            if (comboBox3.SelectedIndex == 0)
            {
                Wkst_Status = true;
            }
            else
            {
                Wkst_Status = false;
            }

            SqlCommand cmd = new SqlCommand

            (@"INSERT INTO [dbo].[Workstations]
           (
           [Emp_Name]
           ,[Emp_Surname]
           ,[Department]
           ,[Company]
           ,[Hostname]
           ,[Wkst_Status]
           ,[Make]
           ,[Model]
           ,[SerialNumber]
           ,[ProductNumber]
           ,[Purch_Date]
           ,[WExpiry_Date]
           ,[Memory]
           ,[Processor]
           ,[HDD]
           ,[OS])

     VALUES
           ('" + txtName.Text + "','" + txtSurname.Text + "','" + comboBox1.Text + "','" + comboBox2.Text + "','" + txtHostName.Text + "','" + comboBox3.SelectedIndex + "','" + txtMake.Text + "','" + txtModel.Text + "','" + txtSN.Text + "','" + txtPN.Text + "','" + dateTimePicker1.Value.ToString("yyyy/MM/dd") + "','" + dateTimePicker1.Value.ToString("yyyy/MM/dd") + "','" + txtMem.Text + "','" + txtProc.Text + "','" + txtHDD.Text + "','" + txtOS.Text + "')",con);


            //Conversion failed here
            cmd.ExecuteNonQuery();
            con.Close();

            //Reading Data
            SqlDataAdapter sda = new SqlDataAdapter(@"Select  [Emp_Name],[Emp_Surname],[Department],[Company],[Hostname],[Wkst_Status],[Make],[Model]
                                                             ,[SerialNumber],[ProductNumber],[Purch_Date],[WExpiry_Date],[Memory],[Processor],[HDD]
                                                             ,[OS] From [dbo].[Workstations]", con);

            DataTable dt = new DataTable();
            sda.Fill(dt);
            dataGridView1.Rows.Clear();

            foreach (DataRow item in dt.Rows)
            {
                int n = dataGridView1.Rows.Add();
                dataGridView1.Rows[n].Cells[0].Value = item["Emp_Name"].ToString();
                dataGridView1.Rows[n].Cells[1].Value = item["Emp_Surname"].ToString();
                dataGridView1.Rows[n].Cells[2].Value = item["Department"].ToString();
                dataGridView1.Rows[n].Cells[3].Value = item["Company"].ToString();
                dataGridView1.Rows[n].Cells[4].Value = item["Hostname"].ToString();

                if ((bool)item["Wkst_Status"])

                {
                    dataGridView1.Rows[n].Cells[5].Value = "Active";
                }
                else
                {
                    dataGridView1.Rows[n].Cells[5].Value = "Inactive";
                }

                dataGridView1.Rows[n].Cells[6].Value = item["Make"].ToString();
                dataGridView1.Rows[n].Cells[7].Value = item["Model"].ToString();
                dataGridView1.Rows[n].Cells[8].Value = item["SerialNumber"].ToString();
                dataGridView1.Rows[n].Cells[9].Value = item["ProductNumber"].ToString();
                dataGridView1.Rows[n].Cells[10].Value = item["Purch_Date"].ToString();
                dataGridView1.Rows[n].Cells[11].Value = item["WExpiry_Date"].ToString();
                dataGridView1.Rows[n].Cells[12].Value = item["Memory"].ToString();
                dataGridView1.Rows[n].Cells[13].Value = item["Processor"].ToString();
                dataGridView1.Rows[n].Cells[14].Value = item["HDD"].ToString();
                dataGridView1.Rows[n].Cells[15].Value = item["OS"].ToString();
            }

        }

        private void label17_Click(object sender, EventArgs e)
        {

        }
    }
}

我做错了什么,我该如何纠正这个问题 

What am i doing wrong and how can i rectify the issue 







推荐答案

我不清楚错误发生的位置。 它是否出现在插入物上? 您有以上评论  cmd.ExecuteNonQuery();这表明它在那里被提升。 或者...当你在阅读器的
行上进行强制转换时,它会被提升:(
bool)item [" Wkst_Status"]

在任何一种情况下,我都有一些建议:

1。如果要表示布尔值

1. Store the Wkst_Status as a bit rather than varchar if it is meant to represent a Boolean

2,请将Wkst_Status存储为一个而不是varchar。您对Wkst_Status的值来自组合框的SelectedIndex属性。 我假设组合框中只有两个选项(true / false)和索引0 = false等。 没关系,但你还需要确保选择了一个值,
否则SelectedIndex将等于-1(不能转换为bool)。

2. Your value for Wkst_Status is derived from the SelectedIndex property of a combobox.  I assume the combobox only has two options in it (true/false) and index 0 = false, etc.  That's OK, but you also need to make sure that a value has been selected, otherwise the SelectedIndex will equal -1 (not castable to bool).

3。您可能希望将insert语句移动到字符串变量,以便您可以调试它并验证insert语句是否反映了有效输入

3. you may want to move the insert statement to a string variable so you can debug it and validate the insert statement is reflecting valid input


这篇关于System.InvalidCastException:'指定的强制转换无效。'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆