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"];

それが問題です。int代わりにキャストするか、次を使用する必要がありますGetInt32

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

(ここで、0 は「列の序数です。名前付き列の序数を取得するためにEmployeeId使用できGetOrdinalます。)

もちろん、メソッドの戻り値の型も変更する必要があります-または、値を文字列として本当に必要な場合はint呼び出します。(私はそれに対して強くお勧めします。)ToString

コンソールに例外を書き出すと、詳細を確認できるはずです。Read実行が呼び出しをまったくスキップしているとは思いません。結果を読み取っていintて、 を に変換できずstring、例外がスローされました。

于 2012-12-03T14:28:29.143 に答える
1

を にキャストしintstringいますが、これはできません。

// 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ものを追加し、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もちろん、これはnullableではないことを前提としています。

于 2012-12-03T14:28:15.700 に答える