0

MVC3 ASP を使用しており、ルートとして MYSQL DB にログインするように web.config ファイルを構成しました。私はうまく接続できる多くのストアドプロシージャを作成しました。私は今、このログインユーザーをtempuserと呼ばれるパブリックユーザーに変更し、rootではなくなりたいと考えています。

ただし、ログイン ユーザーを "root" から "tempuser" に変更すると、エラーが発生します: タイプ 'System.DBNull' のオブジェクトをタイプ 'System.String' にキャストできません

ExecuteNonQuery() の実行時に上記のエラーが発生します。

関数へのアクセスを許可しました: GRANT EXECUTE ON FUNCTION check_user_exists to tempuser@'%';

また、関数が使用するものにアクセスするこのテーブルで「選択」と「更新」を許可しました。tempuser として mysql コマンド ラインにログインし、問題なく関数を手動で呼び出すことができます。しかし、ExecuteNonQuery() を実行すると、上記のエラーが発生します。現在、Visual Web Developer 2010、Razor Engine、MVC3 を使用しています。

助けてください。

私は運が悪いので、何週間も試みてきました。

実行中のコードは次のとおりです。ExecuteScalar() 関数がエラーの場所です。エラーはこの質問の主題です: ただし、「ルート」ユーザーとしてログインすると、エラーは発生しません。

  [HttpPost]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
            // Attempt to register the user

            DBController dbcontroller = new DBController();

            if (dbcontroller.DBConnection())
            {
                MySqlCommand command = new MySqlCommand("check_user_exists_signup", dbcontroller.conn);
                command.CommandType = System.Data.CommandType.StoredProcedure;

                // Add parameters for the check_user_exists_signup STORED FUNCTION
                command.Parameters.Add(new MySqlParameter("@userName", model.UserName));
                command.Parameters["@userName"].Direction = System.Data.ParameterDirection.Input;

                // RETURN parameter for the insert_users STORED FUNCTION
                MySqlParameter cnt_user = command.Parameters.Add("@cnt_user", MySqlDbType.Int32);
                command.Parameters["@cnt_user"].Direction = System.Data.ParameterDirection.ReturnValue;

                try
                {
                    command.ExecuteScalar();
                    object ret = command.Parameters["@cnt_user"].Value;             
                    dbcontroller.conn.Close();

ストアド プロシージャは次のとおりです。

CREATE DEFINER=`root`@`localhost` FUNCTION `check_user_exists_signup`(
       userName varchar(20)) RETURNS int(11)
    DETERMINISTIC
BEGIN
DECLARE cnt_user int;

  select count(*) into cnt_user
    from users 
   where user_name = userName;

RETURN cnt_user;

END
4

2 に答える 2

3

タイプ 'System.DBNull' のオブジェクトをタイプ 'System.String' にキャストできません

まあ、あなたはそれをすることはできません。言わなくちゃいけない

string s = null;
object value = reader["columnName"];
if(value != System.DBNull) {
    s = (string)value;
}

または同等のもの。System.DbNullポイントは、文字列にキャストできないことです。したがって、columnName現在処理している行の列の値が である場合はnull、それを検出する必要があります。それ以外の場合は、安全にキャストを続行できます (基になるデータ型が であると仮定しますstring)。

私は運が悪いので、何週間も試みてきました。

何よりも、このような問題を解決するために何週間も費やすべきではありません。「タイプ 'System.DBNull' のオブジェクトをタイプ 'System.String' にキャストできません」というメッセージを Google に入力し、基本的にあなたの問題であるこの回答をポップアップ表示しました。違う。

于 2012-04-13T12:47:17.777 に答える
0

.Net では、データが NULL の場合、System.DBNull.Value として表されます。DB で NULL を表すのは特定の型であり、暗黙的にキャストすることはできません。したがって、オブジェクトに DB からの値が含まれているとします。theValueとして名前が付けられていますが、データが NULL の場合、 theValue は実際には System.DBNull の型であり、次の式は取得したとおりに例外をスローします。

if(theValue == "blabla")
{
     ....
} 

防ぐのは非常に簡単です。タイプを確認するか、ToString を実行します (.net null ではないことが確実な場合)。空の文字列が得られます。

于 2012-04-13T12:52:07.477 に答える