列不存在服务器错误 - 但 sql 服务器管理说它存在

Posted

技术标签:

【中文标题】列不存在服务器错误 - 但 sql 服务器管理说它存在【英文标题】:Column Doesn't Exist server error - but sql server management says it does 【发布时间】:2012-12-21 14:11:15 【问题描述】:

我正在尝试从 mysql 2008 数据库中导入一个字段。 我写了这个小代码(我以前用过几次) - 它一直给我这个服务器错误:

列'Previous Login'不属于表Table。

第 47 行:DateTime userEntry = Convert.ToDateTime(ds1.Tables[0].Rows[0]["Previous Login"]);

但它确实存在!当我在sql服务器管理中使用相同的查询时,它工作正常,所以我猜返回数据很好,知道我哪里出错了吗?

谢谢!

    
    SqlConnection con = new SqlConnection();
    con.ConnectionString = "server=(local);database=PhilipsMaterials;Integrated Security=SSPI;";
    con.Open();
    DataSet ds = new DataSet();
    DataTable dt = new DataTable();
    // SQL Query that returns only the messages from the last 2 weeks starting with the most recent one.
    string sql = "Select * From Messages Where DATEDIFF(DAY,Date,GETDATE()) <= 14 ORDER BY Date Desc";
    SqlDataAdapter da = new SqlDataAdapter(sql, con);
    da.Fill(ds);
    dt = ds.Tables[0];
    showMsgs.DataSource = ds;
    showMsgs.DataBind();

    // new message notification
    string username = Convert.ToString(Session["username"]);
    username = username.Substring(username.IndexOf("\\") + 1);

    DataSet ds1 = new DataSet();
    DataTable dt1 = new DataTable();
    string sqluser = "Select * From [PhilipsMaterials].[dbo].[Employees] Where username='" + username + "'";
    SqlDataAdapter da1 = new SqlDataAdapter(sqluser, con);
    da.Fill(ds1);
    dt1 = ds1.Tables[0];
    DateTime userEntry = Convert.ToDateTime(ds1.Tables[0].Rows[0]["Previous Login"]);

    DateTime lastMsg = new DateTime();
    lastMsg = Convert.ToDateTime(ds.Tables[0].Rows[0]["Date"]);
    int compared = DateTime.Compare(userEntry, lastMsg);
    if (compared < 0)  notification.Visible = true; 
    con.Close();
 

【问题讨论】:

我的猜测是空格被删除或转换为不同的字符。在调试器中查看ds1.Tables[0].Columns,看看名字是什么。 我的经验一直是它不喜欢列名中的空格。 WHERE username='" + username + "'" 不要这样做!永远不能!为此使用SqlParamters。 en.wikipedia.org/wiki/SQL_injection 嗨丹尼尔,谢谢你的建议,我会看看但这个项目实际上不会在网络上使用,所以安全性是一个非常低的优先级(需要先实际工作) :// 【参考方案1】:

如果您的列名包含空格,您需要进行某种转义 - 尝试使用 [Previous Login] 作为列名,就像在 SQL 语句中一样。

并且 - 如问题评论中所述 - 看看SQL injection and how to avoid it。

【讨论】:

不,尝试使用括号甚至放弃并更改列名以使中间没有空格 - 仍然是同样的怪异错误。 好的,第二次尝试。你看过失败行的所有部分表达式吗? ds1.Tables[0]ds1.Tables[0].Rows[0]ds1.Tables[0].Rows[0]["Previous Login"] 是什么?它们是具有预期属性值的预期对象吗?我建议添加一个断点并使用监视窗口仔细检查对象。 您必须将表达式输入到监视窗口中-只需将表达式复制并粘贴到空行中或选择源代码中的表达式,右键单击并选择Add watch 手表窗口是灰色的,右键->添加手表也是灰色的。很想解决这个问题(调试器) 好吧,我让它工作了。 “不知道为什么不行,现在不知道为什么行”的经典案例之一。

以上是关于列不存在服务器错误 - 但 sql 服务器管理说它存在的主要内容,如果未能解决你的问题,请参考以下文章

错误:“行/列不存在数据”使用 OdbcDataReader

SQL查询列不存在错误

Sql:Haversine 公式错误列不存在

Postgres 列不存在

SharePoint REST:列不存在错误

PGError:错误:关系列不存在