【问题标题】:System.Data.SqlClient.SqlException: Invalid column nameSystem.Data.SqlClient.SqlException:列名无效
【发布时间】:2011-09-03 06:16:46
【问题描述】:

试图做一个记录集,我只想要一列数据,但是这段代码给了我一个错误。我是一个 ASP.NET 新手,谁能帮忙?:

System.Data.SqlClient.SqlException:列名无效 '客户名'。

 using (SqlConnection con = new SqlConnection(DB.GetDBConn()))
 {
  con.Open();
  using (IDataReader dr = DB.GetRS("select CustomerName from Customer where CustomerID=" + Customer.CustomerID, con))
   {
       string CustomerName = "CustomerName";                    
   }
 }

 String EncCustomerName = Encrypt(CustomerName.Replace(".", "").Replace("-", ""),"1");

问题 #2:如何将数据库内容绑定到 CustomerName 字符串?似乎它只返回“CustomerName”作为 CustomerName 字符串的值。我希望它返回 CustomerName 字符串的数据库数据。帮助?

建议使用 ExecuteScalar,所以我修改了这个请求

   using (var con = new SqlConnection(DB.GetDBConn()))
   using (var cmdContrib = new SqlCommand("SELECT CustomerName FROM Customer WHERE   CustomerID=" + ThisCustomer.CustomerID, con))

   {

        con.Open();
        string CustomerName = cmdContrib.ExecuteScalar();
   } 

我得到这个错误: "string CustomerName = cmdCust.ExecuteScalar();"

CS0266:无法将类型“object”隐式转换为“string”。存在显式转换(您是否缺少演员表?)

【问题讨论】:

  • 尝试直接在 Management Studio 中运行查询“从客户中选择客户名称”。我敢打赌你会发现某种拼写错误(真诚地没有侮辱你的智力,这种事情会发生)。
  • 你说得对,我的想法不对。但是现在它不会给我动态数据..它返回“CustomerName”作为CustomerName变量的值,但我想要数据库中的数据,为什么它不返回动态数据?
  • 您明确将CustomerName 设置为“客户名称”。您需要从 dr 访问 CustomerName 列的实际值(类似于 string CustomerName = dr["CustomerName"];
  • @jadarnel27:好的,我这样做了,它说.... 错误 CS0266:无法将类型“对象”隐式转换为“字符串”。存在显式转换(您是否缺少演员表?)
  • string CustomerName = dr["CustomerName"].ToString(); 我在东海岸(美国),现在是凌晨 3 点。我要睡觉了 =) 祝你好运!

标签: asp.net sql-server


【解决方案1】:

回答你的第二个问题:

// Set it here so you can access it outside the scope of the using statement
string CustomerName = "";

using (SqlConnection con = new SqlConnection(DB.GetDBConn()))
{
    con.Open();
    using (IDataReader dr = DB.GetRS("select CustomerName from Customer where CustomerID=" + Customer.CustomerID, con))
    {
        while (dr.Read())
            CustomerName = dr["CustomerName"].ToString();
        }                    
    }
 }

如果您确定只会得到一个 CustomerName 结果,那么使用 DataReader 就有点过头了。

SqlCommand.ExecuteScalar 示例

string CustomerName = "";

using (SqlConnection con = new SqlConnection(DB.GetDBConn()))
{

    SqlCommand cmd = new SqlCommand("SELECT CustomerName FROM Customer WHERE CustomerID = " + Customer.CustomerID, con);
    cmd.CommandType = CommandType.Text;

    con.Open();

    CustomerName = Convert.ToString(cmd.ExecuteScalar());

}

SqlCommand.ExecuteScalar Method

其他信息

ExecuteScalar 返回一个对象,因此您需要将返回的值转换为正确的类型(在本例中为字符串)。

此外,您应该在 using 块之外声明您的 CustomerName 值(就像我在示例中所做的那样) - 否则它将被限制在 using 块之外,并且在它们之外不可用。

【讨论】:

  • 如果我只需要一个结果,我应该改用什么?
  • 我不确定DB 是什么,但您可以使用ADO.NET 和SqlCommand.ExecuteScalar 方法。如果您需要示例,请告诉我。
  • 我找到了一个例子,谢谢..但它仍然给我同样的错误..我将发布新代码
【解决方案2】:

这意味着CustomerNameCustomerID 在您的数据库中不是有效的列。再次检查您的表。

【讨论】:

  • 这是一个有效的列名,就是这样。
  • @Wilkins 这些名字有空格吗?
【解决方案3】:
  1. 确保您尝试连接正确的数据库。
  2. 请参阅 CustomerName 列应位于 Customer 表中。还要检查拼写

【讨论】:

  • 添加您的架构名称,例如 dbo.customer。
【解决方案4】:

首先,调试并检查以下值:

DB.GetDBConn()

您将验证您将在 Studio 中进行与在程序中相同的操作。

我认为这是 db 和您的代码之间的拼写。

一旦你克服了错误,你需要解决这个问题:

{
       string CustomerName = "CustomerName";                    
   }

您没有访问阅读器,请尝试一些关于该内容的教程。

【讨论】:

  • 我并不真正使用阅读器,但我猜 dr["CustomerName"] 会给你一个结果 - 你想用它做什么?
【解决方案5】:

尝试执行select * from customer where ... 并在您的 using datareader 语句上放置一个断点。然后在 datareader 对象上使用 quick-watch 来调查记录集中公开的列。

或者您可以在您选择的数据库上运行 select 语句以确保列名相同。

我同意上面的 Madhur,您的列名拼写不正确。或者您没有连接到正确的数据库。

希望对你有帮助

【讨论】:

  • 如何将数据库内容绑定到 CustomerName 字符串?似乎它只返回“CustomerName”作为 CustomerName 字符串的值。我希望它返回 CustomerName 字符串的数据库数据
  • 请参考上面jadarnel27的评论。您需要更改客户名称的字符串分配。请使用字符串 customername = dr.GetString(dr.GetOrdinal("CustomerName"));或类似的东西。
猜你喜欢
  • 2014-06-14
  • 2019-11-02
  • 2016-04-22
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
相关资源
最近更新 更多