我有以下SQL代码:
CREATE PROCEDURE [dbo].[sproc_tblUser_GetAllInfo]
@Email NCHAR(25),
@UserID INT
AS
SELECT
tblUser.Firstname, tblUser.Lastname, tblPersonal.Age, tblPersonal.Sex
FROM
tblUser, tblPersonal
WHERE
tblUser.UserID = @UserID AND tblPersonal.UserID = @UserID
IF @@ROWCOUNT = 0
SELECT Firstname, Lastname
FROM tblUser
WHERE UserID = @UserID
RETURN @@IDENTITY
此存储过程在以下内容中运行:
protected void Page_Load(object sender, EventArgs e)
{
//copy email from query string
Email = Convert.ToString(Request.QueryString["Email"]);
lblWelcome.Text = "Welcome to Love Finder, " + Email;
UserID = Convert.ToInt32(Request.QueryString["UserID"]);
//add params
db.AddParameter("Email", Email);
db.AddParameter("UserID", UserID);
//execute GetAllInfo query
db.Execute("sproc_tblUser_GetAllInfo");
//if entries in both tables found, do this
if (db.Count == 1)
{
//get parameters
User.ThisID.Firstname = Convert.ToString(db.DataTable.Rows[0]["Firstname"]);
User.ThisID.Lastname = Convert.ToString(db.DataTable.Rows[0]["Lastname"]);
User.ThisID.Sex = Convert.ToString(db.DataTable.Rows[0]["Sex"]);
User.ThisID.Age = Convert.ToInt32(db.DataTable.Rows[0]["Age"]);
//send to text boxes
txtName.Text = Convert.ToString(User.ThisID.Firstname + "" + User.ThisID.Lastname);
txtAge.Text = Convert.ToString(User.ThisID.Age);
txtSex.Text = Convert.ToString(User.ThisID.Sex);
}
else
{
//if only one table entry found (User), do this
User.ThisID.Firstname = Convert.ToString(db.DataTable.Rows[0]["Firstname"]);
User.ThisID.Lastname = Convert.ToString(db.DataTable.Rows[0]["Lastname"]);
txtName.Text = Convert.ToString(User.ThisID.Firstname + "" + User.ThisID.Lastname);
}
}
查询依赖于User
和Personal
表中的列。如果我使用已在两个表中输入列的成员运行应用程序,它将返回我想要的内容。但是,对于仅从User
表收集数据的子查询,我收到以下错误:
System.Data.dll中出现'System.IndexOutOfRangeException'类型的异常,但未在用户代码中处理
附加信息:位置0没有行。
TLDR:
当我通过给它查询字符串传递的参数来自己执行查询时,它会工作并返回它应该的内容。但是,当运行代码时,我收到了上述错误。
任何人都可以对此有所了解吗?这可能是显而易见的事情,但我对C#编程很陌生。
亲切的问候
答案 0 :(得分:1)
为什么不使用left join
?
CREATE PROCEDURE [dbo].[sproc_tblUser_GetAllInfo] (
@Email NVARCHAR(255),
@UserID Int
) AS
BEGIN
SELECT u.Firstname, u.Lastname, p.Age, p.Sex
FROM tblUser u LEFT JOIN
tblPersonal p
ON p.UserID = u.UserId
WHERE u.UserID = @UserID ;
END;
这将始终返回四列。如果找不到匹配项,tblPersonal
中的NULL
将为from
。
您的问题是您的存储过程有时会返回两列,有时会返回四列。然后,C#在解析结果集时遇到问题。
注意:
join
语法。@@IDENTITY
不适合SELECT
语句。NCHAR(25)
不适用于电子邮件地址。首先,25个字符可能不够。其次,NCHAR()
用空格填充地址,这些不合适。答案 1 :(得分:0)
如果您只想制作当前工作的内容,只需更改存储过程:
SELECT Firstname, Lastname
FROM tblUser
WHERE UserID = @UserID
到此:
SELECT Firstname, Lastname, Age='', Sex=''
FROM tblUser
WHERE UserID = @UserID
您始终需要返回相同数量的列。
答案 2 :(得分:0)
return @@identity
?任何方式......我会将您的存储过程修改为..
CREATE PROCEDURE [dbo].[sproc_tblUser_GetAllInfo](
@Email NCHAR (25),
@UserID Int
) AS
BEGIN
SELECT tblUser.Firstname, tblUser.Lastname, tblPersonal.Age, tblPersonal.Sex
FROM tblUser
LEFT OUTER JOIN tblPersonal
ON tblUser.UserID = tblPersonal.UserID
WHERE tblUser.UserID = @UserID
RETURN 0
END
和.net代码if
条件为,摆脱else
if (db.Count >= 1)
{
//get parameters
User.ThisID.Firstname = Convert.ToString(db.DataTable.Rows[0]["Firstname"]);
User.ThisID.Lastname = Convert.ToString(db.DataTable.Rows[0]["Lastname"]);
//send to text boxes
txtName.Text = string.Format("{0} {1}", User.ThisID.Firstname, User.ThisID.Lastname);
if (!string.IsNullOrEmpty(db.DataTable.Rows[0]["Sex"]))
{
User.ThisID.Sex = Convert.ToString(db.DataTable.Rows[0]["Sex"]);
txtSex.Text = Convert.ToString(User.ThisID.Sex);
}
if (!string.IsNullOrEmpty(db.DataTable.Rows[0]["Age"]))
{
User.ThisID.Age = Convert.ToInt32(db.DataTable.Rows[0]["Age"]);
txtAge.Text = Convert.ToString(User.ThisID.Age);
}
}