Ошибка преобразования типа данных nvarchar в float

#asp.net

#asp.net

Вопрос:

Вот код:

 protected void Button11_Click(object sender, EventArgs e)
    {
            String usr = Membership.GetUser(false).ToString();
            int x, count = 0, avail_shares,num;
            float t_c, c_p, c_t,ret,com,t_r,pr;
            String comp = this.DropDownList4.SelectedValue.ToString();

            avail_shares = Convert.ToInt32(this.TextBox10.Text);
            pr = float.Parse(this.TextBox15.Text);
            t_c = float.Parse(this.TextBox14.Text);
            c_p = float.Parse(this.TextBox12.Text);
            c_t = float.Parse(this.TextBox131.Text);
            ret = float.Parse(this.TextBox132.Text);
            com = float.Parse(this.TextBox133.Text);
            t_r = float.Parse(this.TextBox13.Text);
            num = Convert.ToInt32(this.TextBox11.Text);

            if (num > avail_shares)
            {
                this.Label23.Text = "You cannot sell more number of shares than what you actuall have"; 
            }
            else
            {
                DbProviderFactory dbproviderfactory = DbProviderFactories.GetFactory("System.Data.SqlClient");
                using (DbConnection conn = dbproviderfactory.CreateConnection())
                {
                    string s = ConfigurationManager.ConnectionStrings["Project_FinanceConnectionString"].ConnectionString;

                    conn.ConnectionString = s;

                    conn.Open();


                    DbCommand cmd = conn.CreateCommand();
                    //DbCommand cmd1 = conn.CreateCommand();

                    cmd.CommandText = "INSERT INTO sell_activity(username,company,avail_units,old_price,total_old_price,new_price,total_new_price,number,ret,commission,total_return,timestamp)VALUES(@U,@C,@A_U,@O_P,@T_O_P,@N_P,@T_N_P,@N,@R,@C,@T_R,@T)";

                    //cmd1.CommandText = "SELECT EventID from EventsTable where EventName = ename";                    


                    SqlParameter U = new SqlParameter("@U", SqlDbType.NVarChar, 256);
                    SqlParameter C = new SqlParameter("@C", SqlDbType.NVarChar, 50);
                    SqlParameter A_U = new SqlParameter("@A_U", SqlDbType.Int);
                    SqlParameter O_P = new SqlParameter("@O_P", SqlDbType.Float);
                    SqlParameter T_O_P = new SqlParameter("@T_O_P", SqlDbType.Float);
                    SqlParameter N_P = new SqlParameter("@N_P", SqlDbType.Float);
                    SqlParameter T_N_P = new SqlParameter("@T_N_P", SqlDbType.Float);
                    SqlParameter N = new SqlParameter("@N", SqlDbType.Int);
                    SqlParameter R = new SqlParameter("@R", SqlDbType.Float);
                    SqlParameter Commi = new SqlParameter("@Commi", SqlDbType.Float);
                    SqlParameter T_R = new SqlParameter("@T_R", SqlDbType.Float);
                    SqlParameter T = new SqlParameter("@T", SqlDbType.DateTime);


                    U.Value = usr;
                    C.Value = comp;
                    A_U.Value = avail_shares;
                    O_P = pr;
                    T_O_P = t_c;
                    N_P=c_p;
                    T_N_P = c_t;
                    N = num;
                    R = ret;
                    Commi = com;
                    T_R = t_r;
                    T = DateTime.Now;

                    cmd.Parameters.Add(@U);
                    cmd.Parameters.Add(@C);
                    cmd.Parameters.Add(@A_U);
                    cmd.Parameters.Add(@O_P);
                    cmd.Parameters.Add(@T_O_P);
                    cmd.Parameters.Add(@N_P);
                    cmd.Parameters.Add(@T_N_P);
                    cmd.Parameters.Add(@N);
                    cmd.Parameters.Add(@R);
                    cmd.Parameters.Add(@Commi);
                    cmd.Parameters.Add(@T_R);
                    cmd.Parameters.Add(@T);

                    [b]DbDataReader reader = cmd.ExecuteReader();[/b]
                    try
                    {
                        if (reader.HasRows)
                        {

                            while (reader.Read())
                            {

                            }
                        }
                    }
                    catch (Exception err)
                    {
                        Response.Write("Problem in retriving the latest values..Please try again.");
                        Response.Write(err);
                    }
                    reader.Close();
                }

            }
    }
  

После того, как я пытаюсь протестировать страницу, я получаю следующую ошибку:

System.Data.SqlClient.SQLException: [b] Ошибка преобразования типа данных nvarchar в float. [/b] в System.Data.SqlClient.SqlConnection.Ошибка onError (исключение SQLException, логическое прерывание соединения) в System.Data.SqlClient.SqlInternalConnection.Ошибка onError (исключение SQLException, логическое прерывание соединения) в System.Data.SqlClient.TdsParser.Throw exceptionandwarning(TdsParserStateObject stateObj) в System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) в System.Data.SqlClient.SqlDataReader.ConsumeMetaData() в System.Data.SqlClient.SqlDataReader.get_MetaData() в System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) в System.Data.SqlClient.SqlCommand.RunExecuteReader( CommandBehavior cmdBehavior, RunBehavior runBehavior, Логический поток возврата, строковый метод, результат DbAsyncResult) в системе.Data.SqlClient.SqlCommand.RunExecuteReader(командное поведение cmdBehavior, RunBehavior runBehavior, логический поток возврата, строковый метод) в System.Data.SqlClient.SqlCommand.ExecuteReader (поведение CommandBehavior, строковый метод) в System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (командное поведение) в System.Data.Обычный.DbCommand.ExecuteReader() в портфолио.Button11_Click(отправитель объекта, EventArgs e) в e:StudyLAST SEMProjectBackupFinance1portfolio.aspx.cs:строка 1187

Есть идеи, ребята..

Я также пытался отлаживать с помощью watch, и каждая переменная получает значение, которое она shd get..so Я не понимаю причину проблемы: ( пожалуйста, помогите мне

Комментарии:

1. Есть ли причина, по которой вы используете DbConnection / DbCommand вместо SqlConnection / SqlCommand? Кроме того, представляется более вероятным, что ваша таблица sell_activity может иметь тип данных, отличный от того, который указан в вашей инструкции INSERT / параметрах SQL. Взгляните на sell_activity и убедитесь, что каждый столбец, который должен иметь тип float, является float .

Ответ №1:

Метод ExecuteReader обычно используется для получения результатов запроса (SELECT) в виде объекта DataReader. Но я вижу, что вы пытаетесь выполнить вставку. Я предлагаю использовать SqlCommand.Вместо этого выполните onquery и посмотрите, работает ли это.

Точнее заменить

 DbDataReader reader = cmd.ExecuteReader();

if (reader.HasRows)
{
    while (reader.Read())
    {
    }
}
  

с

 cmd.ExecuteNonQuery();
  

Также проверьте, соответствует ли какой-либо из параметров SqlParameters, которые вы создаете с помощью типа SqlDbType.NVarChar, столбцу типа float в базе данных. Используйте соответствующие типы для параметров SqlParameters.