列不存在服务器错误 - 但 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 + "'"
不要这样做!永远不能!为此使用SqlParamter
s。 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 服务器管理说它存在的主要内容,如果未能解决你的问题,请参考以下文章