C# 无法将“System.object[]”类型的对象强制转换为“System.String[]”类型

C# 无法将“System.object[]”类型的对象强制转换为“System.String[]”类型,c#,visual-studio-2008,sql-server-2005-express,C#,Visual Studio 2008,Sql Server 2005 Express,我正在开发一个C VS 2008/SQL Server网站应用程序。我是ASP.NET的新手。然而,在下面代码的最后一行,我得到了上面的错误。你能给我一些关于如何解决这个问题的建议吗?这可以正确编译,但是在运行它之后我遇到了这个错误 我所要做的就是将dt第二行中的项存储到字符串参数中。第一行是标题,所以我不想要这些值。第二行是值的第一行。我的SQL存储过程需要这些值作为字符串。所以我想解析第二行数据并加载到2个字符串参数中。我在下面添加了更多代码 DataTable dt; Hashtable

我正在开发一个C VS 2008/SQL Server网站应用程序。我是ASP.NET的新手。然而,在下面代码的最后一行,我得到了上面的错误。你能给我一些关于如何解决这个问题的建议吗?这可以正确编译,但是在运行它之后我遇到了这个错误

我所要做的就是将dt第二行中的项存储到字符串参数中。第一行是标题,所以我不想要这些值。第二行是值的第一行。我的SQL存储过程需要这些值作为字符串。所以我想解析第二行数据并加载到2个字符串参数中。我在下面添加了更多代码

DataTable dt; 
Hashtable ht;
string[] SingleRow;
...
SqlConnection conn2 = new SqlConnection(connString);
SqlCommand cmd = conn2.CreateCommand();
cmd.CommandText = "dbo.AppendDataCT";
cmd.Connection = conn2;
SingleRow = (string[])dt.Rows[1].ItemArray;
            SqlParameter sqlParam = cmd.Parameters.AddWithValue("@" + ht[0], SingleRow[0]);
            sqlParam.SqlDbType = SqlDbType.VarChar;
            SqlParameter sqlParam2 = cmd.Parameters.AddWithValue("@" + ht[1], SingleRow[1]);
            sqlParam2.SqlDbType = SqlDbType.DateTime;
我的错误:

System.InvalidCastException was caught
  Message="Unable to cast object of type 'System.Object[]' to type 'System.String[]'."
  Source="App_Code.g68pyuml"
  StackTrace:
       at ADONET_namespace.ADONET_methods.AppendDataCT(DataTable dt, Hashtable ht) in c:\Documents and Settings\Admin\My Documents\Visual Studio 2008\WebSites\Jerry\App_Code\ADONET methods.cs:line 88
  InnerException: 

不能将对象数组强制转换为字符串数组,必须强制转换数组中的每个项,因为必须检查每个项是否可以强制转换。您可以使用强制转换方法进行以下操作:

SingleRow = dt.Rows[1].ItemArray.Cast<string>().ToArray();
var yourStringArray = dt.Rows[1].ItemArray
    .Select(o => (o ?? (object)String.Emtpy).ToString())
    .ToArray();

您可以为此使用LINQ:

SingleRow = dt.Rows[1].ItemArray.Cast<string>().ToArray();
var yourStringArray = dt.Rows[1].ItemArray
    .Select(o => (o ?? (object)String.Emtpy).ToString())
    .ToArray();

这将使用ToString将数组的每个项转换为字符串,如果该项为null,则返回空字符串。

Hmmm。您正在尝试访问DataTable dt的属性,但看起来您可能希望该表包含AppendDataCT查询的结果。没有。还要注意行索引访问:C中的数组是基于0的,dt.Rows[1]将检索表中的第二行

除此之外,请查看文档以了解更多信息。该方法返回一个对象数组,而不是字符串数组。即使您的行只包含字符串,您仍然在处理一个对象数组,您必须这样对待它。如果该列的数据类型正确,则可以将行中的每个单独项转换为字符串:

foreach (string s in dt.Rows[1].ItemArray)
{
  //...
}
编辑:好的,作为对你编辑的回应,我知道你想做什么。有很多不同的方法可以做到这一点,我特别建议您远离哈希表,转而使用通用的等价物,比如-这样可以省去很多运行时的麻烦。也就是说,下面是代码的最简单改编:

DataRow dr = dt.Rows[1]; // second row
SqlParameter p1 = cmd.Parameters.AddWithValue((string)ht[0], (string)dr[0]);
SqlParameter p2 = ...
你不需要领导,;ADO.NET将为您添加这些内容。只要键0处有一个字符串,字符串强制转换就可以工作,这是使用哈希表的一种相当非标准的方法-通常会有某种描述性键,并且如果datatable中的第一列包含字符串


我建议你看看和。这里缺少它们使得您的代码有点脆弱

每个列项都有自己的类型,可以不同于字符串,因此如果要将每个行值存储到数组中,必须使用循环或LINQ逐个执行,我没有测试此代码段,但应该执行以下操作:

(from columnVal in dt.Rows[1].ItemArray
select columnVal.ToString()).ToArray();
您也可以使用Cast.ToArray,但这种方法适用于更多的框架版本,并且从一开始就正确地获得数组大小,而不是调整它的大小。这样做怎么样:将string[]SingleRow设置为object[]SingleRow,这将使

SingleRow = (object[])dt.Rows[1].ItemArray;
执行得当。随后,当您需要以字符串数组的形式访问它的值时,可以按如下方式对其进行强制转换或LINQ选择:

objectArray.Select<object, string>
   (c => (c != null ? c.ToString() : "")).ToArray();

谢谢,我试过了,但它给了我一个编译器错误。Cast在这种情况下是不可识别的。我认为,该代码需要Linq,因此您需要使用.net 3.5或更高版本,并且必须引用Linq并使用System。LinqI喜欢这个答案,因为它看起来很简单。但是当我试图在这个foreach语句中输入内容时,我得到了编译器错误:使用未分配的局部变量'SingleRow'我的语句:SingleRow[I]=dt.Rows[1].ItemArray.ToString;如果不更好地理解你想要实现的目标,就很难回答你。这就是说,在访问单行对象的属性之前,您需要实例化单行对象。总体来说,您能描述一下您试图实现的目标吗?也许一些伪代码会有帮助。谢谢你的帮助,迈克尔!我还没有让我的代码正常工作,但我仍在学习字典。很抱歉,我试图给你一个多+投票支持你的努力工作,但它重置为零。如果您编辑您的答案,我会将其重置回1。LINQ查询表达式是C3.0+的一个组件。我必须为此包含任何特殊名称空间吗?System.LINQ,如果不包含。你的项目必须有.NET3.5或4.0作为目标框架。感谢你的代码,我做的有点不同,但基于你的例子。captchaResponse.errorcodes=从对象[]jsonResults[error codes]中的errMsg选择errMsg.ToString.ToArray;我喜欢您的解决方案也使用这一行:SingleRow=dt.Rows[1].ItemArray.Selecto=>o??objectString.Emtpy.ToString.ToArray;但我发现了一个错误:错误1“object[]”不包含“Select”的定义,并且找不到接受“object[]”类型的第一个参数的扩展方法“Select”?是否缺少using指令或程序集引用?…我以前从未使用过LINQ。我将如何具体说明这一点
第二线?我尝试了两种objectArray.Selectc=>c.ToString.ToArray;和SingleRow.Selectc=>c.ToString.ToArray;但是两个都给了我编译器错误。你使用的是哪个版本的.NET?嗯。。。我还忘了提到,您应该添加usingsystem.Linq;使用System.Collections.Generic;它是3.5SP1。我使用语句添加了这些内容,但仍然遇到编译器错误:“objectArray”名称在当前上下文中不存在