1

我对以下问题感到困惑;

我正在尝试使用 SqlDataReader 检索记录(列 'EmployeeId' (int))。

当我直接在服务器上运行查询时,我得到了正确的记录。当我运行相同的程序来获取另一列(字符串)时,我正确地得到了记录。

我认为问题是由于我尝试获取 int,程序跳过

while (mySqlDbDataReader.Read())

并直接前往

catch (Exception eMsg1)
            {

这是完整的程序

public string getUserId()
{
    //Check user details against login in Db
    //Local variables to capture values from Db
    string varId = "";

    //Connection string
    conn = sqlDbConnection.GetConnection();
    SqlCommand newCmd = conn.CreateCommand();
    newCmd.Connection = conn;
    newCmd.CommandType = CommandType.Text;

    //Query
    userCredentials connectedUser = new userCredentials();
    newCmd.CommandText = "SELECT EmployeeId FROM tblEmployees WHERE WinLogin='" + connectedUser.getWindowsLogin() + "';";

    //Connect
    newCmd.Connection = conn;
    conn.Open();

    //Utilisation du try-catch permettant de fermer la connexion même en cas de plantage
    try
    {
        SqlDataReader mySqlDbDataReader = newCmd.ExecuteReader();
        while (mySqlDbDataReader.Read())
        {
            //Tester que le résultat n’est pas NULL afin d’éviter un plantage au moment du crash
            if (mySqlDbDataReader["EmployeeId"] != System.DBNull.Value)
            {
                //Récupérer le nom à l’aide d’un cast
                varId = (string)mySqlDbDataReader["EmployeeId"];                        
            }
            else
            {
                varId = "Unknown";                       
            }
        }
    }
    catch (Exception eMsg1)
    {
        //In the event of trouble, display error msg
        //MessageBox.Show("Error while executing query: " + eMsg1.Message);
        Console.WriteLine(eMsg1);

        //Control
        MessageBox.Show("Empty");
    }
    finally
    {
        //Close DB connection
        conn.Close();
    }

    return varId;
}`

谢谢你的帮助!

布莱斯

4

4 回答 4

7

我正在尝试使用 SqlDataReader 检索记录(列 'EmployeeId' (int))。

那么你为什么要转换成字符串呢?

varId = (string)mySqlDbDataReader["EmployeeId"];

那就是问题所在。您应该将其转换为 a int,或使用GetInt32

// You don't need a local variable for this at all...
return mySqlDbDataReader.GetInt32(0);

(这里的 0 是“EmployeeId列的序号;您可以使用它GetOrdinal来获取命名列的序号。)

当然,您还需要将方法的返回类型更改int为 - 或者ToString如果您真的希望该值作为字符串,则调用。(不过,我强烈建议不要这样做。)

当您将异常写入控制台时,您应该能够看到详细信息。我认为执行根本不会跳过Read调用-它正在读取结果,然后无法将其转换int为 a string,从而导致引发异常。

于 2012-12-03T14:28:29.143 回答
1

您正在将 a 投射int到 a string,这是您无法做到的。

// Change varId to an int and cast to an int
varId = (int)mySqlDbDataReader["EmployeeId"];

或者

// Call ToString to get the string representation of the underlying value
varId = mySqlDbDataReader["EmployeeId"].ToString();
于 2012-12-03T14:29:56.277 回答
1

两个乔恩斯都是正确的。正是这种铸造似乎引发了问题。我想建议使用 TypedQueryTableAdapter来达到您的目的。只需DataSet在您的项目中添加一个新的,在数据​​集设计器中单击鼠标右键并添加一个查询。在此处键入您的查询,引入您的变量(我猜在这种情况下为用户名),它将在您的 QueryAdapter 中生成一个查询函数,该函数将接受您的变量,运行查询并返回 EmployeeID。此外,它还将使您免于 SQL 注入类型的事情,因为它在内部使用类型化参数。

于 2012-12-03T14:40:37.997 回答
0

尝试转换int:

代替

//Récupérer le nom à l’aide d’un cast
varId = (string)mySqlDbDataReader["EmployeeId"];   

采用

//Récupérer le nom à l’aide d’un cast
varId = mySqlDbDataReader["EmployeeId"].ToString();   

这当然是假设它EmployeeId不可为空。

于 2012-12-03T14:28:15.700 回答