SQL查询返回数据,但不在代码中填充

时间:2018-04-02 21:23:51

标签: c# sql-server

我有以下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);
        }
    }

查询依赖于UserPersonal表中的列。如果我使用已在两个表中输入列的成员运行应用程序,它将返回我想要的内容。但是,对于仅从User表收集数据的子查询,我收到以下错误:

  

System.Data.dll中出现'System.IndexOutOfRangeException'类型的异常,但未在用户代码中处理

     

附加信息:位置0没有行。

TLDR:

当我通过给它查询字符串传递的参数来自己执行查询时,它会工作并返回它应该的内容。但是,当运行代码时,我收到了上述错误。

任何人都可以对此有所了解吗?这可能是显而易见的事情,但我对C#编程很陌生。

亲切的问候

3 个答案:

答案 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#在解析结果集时遇到问题。

注意:

  • 如果要使用结果集,请使用表函数而不是存储过程。这是适当的使用方法。
  • 请勿在{{1​​}}子句中使用逗号。使用正确,正确的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);
}
}