我正在尝试获取添加db中最后一条记录的用户的名称。 查询是正确的,但我得到错误“无法将类型转换为int”到“string”。数据库中的数据类型是varchar。 我做错了什么?
protected void LastProject()
{
string lastProjUser = "SELECT name FROM Users WHERE uname = (SELECT MAX(id) FROM Projects)";
string getconnstring = ConfigurationManager.ConnectionStrings["stad_conn"].ConnectionString;
SqlConnection conn = new SqlConnection(getconnstring);
using (SqlCommand lastProjUserName
= new SqlCommand(lastProjUser, conn))
{
conn.Open();
lastProjUserName.CommandType = CommandType.Text;
string name = (string)lastProjUserName.ExecuteNonQuery(); //ERROR IS HERE
Label3.Text = name;
conn.Close();
}
}
更新 来自最高“id”的表“项目”我需要知道“uname” 表“用户”我需要与“用户名”相关联的“名称”,这是“项目”表中的uname
表项目:
[id] INT IDENTITY (1, 1) NOT NULL,
[proj_id] VARCHAR (20) NULL,
[proj_prod_id] VARCHAR (20) NULL,
[uname] VARCHAR (50) NULL,
表用户
[id] INT IDENTITY (1, 1) NOT NULL,
[name] VARCHAR (50) NULL,
[username] VARCHAR (50) NULL,
[pass] VARCHAR (50) NULL,
答案 0 :(得分:2)
您正在将名称字段与ID字段进行比较,您的意思是这样做吗?
答案 1 :(得分:2)
您的数据库架构设计非常糟糕,但如果您遇到困难,可以尝试:
SELECT uname FROM Projects WHERE id IN (SELECT MAX(id) FROM Projects)
答案 2 :(得分:1)
SQL语句应为
SELECT name
FROM Users
WHERE id = (SELECT MAX(id) FROM Projects)
(WHERE id = ...
代替WHERE name = ...
)。
ExecuteNonQuery
返回受影响的记录数。这不是你想要的。请改用ExecuteScalar
。
string name = (string)lastProjUserName.ExecuteScalar();
ExecuteScalar
返回查询返回的第一行的第一列。
<强>更新强>
如果我考虑到您的最新修改,我会得到:
SELECT
u.name
FROM
Users u
INNER JOIN Projects p
ON u.username = p.uname
WHERE
p.id = (SELECT MAX(id) FROM Projects)
答案 3 :(得分:0)
1。考虑更改您的查询,因为将id
列(int
)与name
列(varchar
)进行比较无效不符合你的目的。
2。在运行ExecuteReader()
查询时,您需要致电ExecuteNonQuery()
而不是Select
。
SqlDataReader reader=lastProjUserName.ExecuteReader();
if(reader.Read())
string name = reader["name"].ToString();
3。如果id
表中有users
列,并且projects
表id
列使用{{1} }&amp;您可以在primary key
foreign key
关系
query
完整代码:
"SELECT name FROM Users WHERE id= (SELECT MAX(id) FROM Projects)";
答案 4 :(得分:0)
像这样更改lastProjUser:
"SELECT name FROM Users WHERE Id = (SELECT MAX(id) FROM Projects)"