Muhammad nur Ihsan Ответов: 2

C# VS, sqlexpress - как использовать значение datatable и сделать простой расчет времени с помощью textbox и отобразить результат во втором текстовом поле C#?


я новичок в этом деле

я хотел создать только плюс-расчет с помощью button&txtbox и отобразить его в другом текстовом поле, используя data int в моей базе данных sqlexprs.

я создал БД и dtable в инструменте управления sqlserver есть только название продукта и цена.


как мне это сделать.. пожалуйста, приведите пример

Что я уже пробовал:

Это мой уровень доступа к данным.cs

public static class DAL
    {
        public static DataTable ExecSP(string spName, List<SqlParameter> sqlParams = null)
        {
            string strConnect = "Server=PC\\SQLEXPRESS;Database=MyLoginApp;Trusted_Connection=True;";     
            SqlConnection conn = new SqlConnection();
            DataTable dt = new DataTable();

            try
            {
                //Connect to the database
                conn = new SqlConnection(strConnect);
                conn.Open();

                //Build an sql command / query
                SqlCommand cmd = new SqlCommand(spName, conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddRange(sqlParams.ToArray());

                //Execute command
                SqlCommand command = conn.CreateCommand();
                SqlDataReader dr = cmd.ExecuteReader();

                //fill datatable with the results
                dt.Load(dr);


            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                //No matter what happends this will run
                conn.Close();
            }
            return dt;
        }
    }


Это функция кнопки, которую я хочу создать..
"Базосукост"должно быть значение в таблице dtable

 private void btnHitung_Click(object sender, EventArgs e)
        {
          if (int.TryParse(txtBasoSU.Text, out NumberofOrder))
            {
                ItemBasoSU = Double.Parse(txtBasoSU.Text);
                TotalPriceOfBasoSU = BasoSUCost * ItemBasoSU;
}

2 Ответов

Рейтинг:
2

OriginalGriff

Хм.
Я не вижу ничего, что включало бы ваш DataTable вне метода, в котором вы его загружаете (и вам было бы лучше сделать это с помощью DataAdapter, а не DataReader - это включает в себя гораздо меньше обходов в БД), поэтому совершенно не очевидно, что вы хотите сделать.

Но... на ум приходят две вещи: зачем ловить все исключения, если все, что вы собираетесь сделать, это повторно бросить их? Это совсем не помогает, а только все усложняет. Вы можете просто взять try...finally блок и пропустить catch если это то, что вы пытаетесь сделать, или даже лучше использовать using блок для закрытия и удаления соединения (и еще один для команды) вместо блока try.

using (SqlConnection conn = new SqlConnection(strConnect))
    {
    using (SqlCommand cmd = new SqlCommand(spName, conn))
        {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddRange(sqlParams.ToArray());
        using (DataAdapter da = new SqlDataAdapter(cmd))
            {
            da.Fill(dt);
            }
        }
    }

Во-вторых, если это double тогда он провалится. int.TryParse тест - наличие '.' в текстовой строке будет означать, что это не целое число, поэтому внешний TryParse потерпит неудачу и никогда не доберется до Double.Разбор. Используйте Двойное.TryParse как единственный и неповторимый тест, и используйте значение, которое он преобразовал:
private void btnHitung_Click(object sender, EventArgs e)
    {
    double value;
    if (double.TryParse(txtBasoSU.Text, out value))
        {
        TotalPriceOfBasoSU = BasoSUCost * value;
        ...
        }
    }


Muhammad nur Ihsan

что такое двойное значение; для чего? как точно получить значение из таблицы данных sql server?.

OriginalGriff

Когда вы используете TryParse, он сохраняет результат в переменной, которую вы передаете ему через параметр out, и возвращает true/false для "хорошего/плохого преобразования"
двойное значение;
это просто объявление переменной, в которую нужно вставить преобразованное значение, если преобразование работает.

Muhammad nur Ihsan

его действительно трудно понять, я просто хотел получить значение из datatable в мое текстовое поле..

OriginalGriff

Это сложнее, чем вы думаете, потому что DataTable не содержит только одно значение - это таблица, что означает, что она содержит строки столбцов данных.
Первое, что вам нужно решить, - это какая строка вам нужна и какой столбец этой строки?

Muhammad nur Ihsan

хорошо, так что у меня есть 2 столбца есть "продукты" и "цена" у меня есть только 5 строк один из них "BasoSU" он имеет "2000" для цены, как я хочу умножить его цену с любым числом, введенным из текстового поля.... пожалуйста, приведите пример еще раз.. что вообще мне нужно добавить в программу?

и кстати, класс DAL предназначен для формы входа и регистрации, нужно ли мне снова создавать класс для этой проблемы?

OriginalGriff

Нет, это не так - у строк нет "имен", это делают только столбцы.
Вы имеете в виду, что у вас есть строка, содержащая столбец продукта, содержащий текст "BasoSU"?

Muhammad nur Ihsan

да колонка продукта содержащая текст BasoSU
и столбец цены, содержащий текст 2000 <-- я хочу сделать расчет типа 2 * 2000 и установить его в BasoSUCost in


"частная btnHitung_Click недействительным(объект отправителя, EventArgs в электронной)
{
if (int.Метод tryparse(txtBasoSU.Текст, из NumberofOrder))
{
ItemBasoSU = Двойной.Синтаксический анализ(txtBasoSU.Текст);
TotalPriceOfBasoSU = BasoSUCost * ItemBasoSU;
}"

Muhammad nur Ihsan

перед тем как использовать sql server для создания данных я просто записываю значение в форму cs следующим образом

общественный разделяемого класса Meja1 : форма
{

//АНАЛИЗАТОР - АНАЛИЗАТОР ЦЕНА MAKANAN
double cBasoSU_PRICE = 20000;
double cBasoC_PRICE = 15000;
double cBasoM_PRICE = 15000;
double cBasoB_PRICE = 15000;
двойная cMieA_PRICE = 11000;
double cMieAB_PRICE = 15000;

общественные Meja1()
{
метод InitializeComponent();
}

частная btnHitung_Click недействительным(объект отправителя, EventArgs в электронной)
{



//ДЕКЛАРАСИ
// Стоимость //angka inputmakan //var dijadikan dariatas
Двойной BasoSUCost; Двойной ItemBasoSU; Двойной HargaBasoSU;
Двойной BasoCCost; Двойной ItemBasoC; Двойной HargaBasoC;
Двойной BasoMCost; Двойной ItemBasoM; Двойной HargaBasoM;
Двойной BasoBCost; Двойной ItemBasoB; Двойной HargaBasoB;

//Ми
Двойной MieACost; Двойной ItemMieA; Двойной HargaMieA;
Двойной MieABCost; Двойной ItemMieAB; Двойной HargaMieAB;

//ПРЕОБРАЗОВАТЬ
//MAKANAN
BasoSUCost = cBasoSU_PRICE;
BasoCCost = cBasoC_PRICE;
BasoMCost = cBasoM_PRICE;
BasoBCost = cBasoB_PRICE;
MieACost = cMieA_PRICE;
MieABCost = cMieAB_PRICE;

if (int.Метод tryparse(txtBasoSU.Текст, из NumberofOrder))
{
ItemBasoSU = Двойной.Синтаксический анализ(txtBasoSU.Текст);
HargaBasoSU = BasoSUCost * ItemBasoSU;

if (int.Метод tryparse(txtBasoC.Текст, из NumberofOrder))
{
ItemBasoC = Двойной.Синтаксический анализ(txtBasoC.Текст);
HargaBasoC = BasoCCost * ItemBasoC;

if (int.Метод tryparse(txtBasoM.Текст, из NumberofOrder))
{
ItemBasoM = Двойной.Синтаксический анализ(txtBasoM.Текст);
HargaBasoM = BasoMCost * ItemBasoM;

if (int.Метод tryparse(txtBasoB.Текст, out NumberofOrder))
{
ItemBasoB = Двойной.Синтаксический анализ(txtBasoB.Текст);
HargaBasoB = BasoBCost * ItemBasoB;

if (int.Метод tryparse(txtMieA.Текст, из NumberofOrder))
{
ItemMieA = Двойной.Синтаксический анализ(txtMieA.Текст);
HargaMieA = MieACost * ItemMieA;

if (int.Метод tryparse(txtMieAB.Текст, из NumberofOrder))
{
ItemMieAB = Двойной.Синтаксический анализ(txtMieAB.Текст);
HargaMieAB = MieABCost * ItemMieAB;

mcFoodTotal = HargaBasoSU + HargaBasoC + HargaBasoM + HargaBasoB + HargaMieA + HargaMieAB;

тхцервисмаканан.текстовая строка.Формат("Rp. {0:N} ", mcFoodTotal);
}
}
}
}
}
}
я хочу использовать sqlserver для хранения данных, чтобы я мог легко изменить значение, но на самом деле это чертовски трудно, лол

OriginalGriff

Это не так "трудно, как ад" - просто вы должны понять, что происходит! И как только вы это сделаете, использование БД станет вашей второй натурой, и вы зададитесь вопросом, из-за чего весь этот шум...

Полные сведения-это слишком много, чтобы вдаваться в такое маленькое текстовое поле, как это, но в основном таблица БД содержит "подобную" информацию вместе: таким образом, у вас есть столбец "продукт" и столбец "цена", и каждая строка таблицы содержит другой продукт и связанную с ним цену.
Таблица проведут тип nvarchar(МАКС) (который является SQL-говорить за "строка") вызвать "продукта" и поплавок столбца (который является SQL-говорить за "двойной") под названием "Цена".
Когда вам нужно определенное значение из БД вы можете запросить только это одно значение с помощью запроса SELECT:

using (SqlCommand cmd = new SqlCommand("SELECT Price From MyTable WHERE Product = 'BasoSU'", con))
   {
   double value = (double) cms.ExecuteScalar();
   ...
   }

ExecuteScalar предназначен для возврата только одного значения, которое затем преобразуется обратно в double.

Есть ли в этом смысл?

Muhammad nur Ihsan

ладно , а для чего нужен кон?

частная btnHitung_Click недействительным(объект отправителя, EventArgs в электронной)
{
используя (команда sqlcommand cmd и = новая команда sqlcommand("Select Цена от продуктов, где продукт = 'BasoSU'", кон))
{
double BasoSUCost = (двойной)cmd.Executescalar так();
...
}

OriginalGriff

Это объект SqlConnection, который вы уже открыли.

И прежде чем вы спросите, можете ли вы догадаться, что такое "MyTable"? :смеяться:

Muhammad nur Ihsan

да, мое имя базы данных-MyLoginApp, а имя таблицы - "продукты"
пожалуйста помогите я хочу сделать 2000 быть BasoSUCost так что я могу сделать расчет из него :(

я хочу установить 2000, чтобы быть BasoSUCost здесь

частная btnHitung_Click недействительным(объект отправителя, EventArgs в электронной)
{
if (int.Метод tryparse(txtBasoSU.Текст, из NumberofOrder))
{
ItemBasoSU = Двойной.Синтаксический анализ(txtBasoSU.Текст);
TotalPriceOfBasoSU = BasoSUCost * ItemBasoSU;
}


OriginalGriff

Так что вы знаете, чем заменить "MyTable" тогда.
И я знаю, что вы знаете, как создать и открыть SqlConnection...

Muhammad nur Ihsan

черт.. могу ли я дать вам свой источник и помочь мне xD или как я могу загрузить фотографию здесь.. спасибо за ответ в любом случае, но все еще смущает меня

OriginalGriff

Нет, давай - это твое домашнее задание, а не мое! :смеяться:
Просто подумайте об этом и посмотрите на то, что у вас есть так afr - у вас есть все биты, которые вам должны понадобиться.

Muhammad nur Ihsan

можете ли вы объяснить "двойное значение = (double)cmd.Executescalar так();"

защищенный SqlConnection conn;

частная btnHitung_Click недействительным(объект отправителя, EventArgs в электронной)
{
используя (команда sqlcommand cmd и = новая команда sqlcommand("Select Цена от продуктов, где продукт = 'BasoSU'", соед))
{
двойное значение = (double)cmd.Executescalar так();
}

OriginalGriff

Я сделал:
"ExecuteScalar предназначен для возврата только одного значения, которое вы затем возвращаете в double."
Он выполняет команду, которую вы ему дали, и возвращает одно значение.

Muhammad nur Ihsan

ExecuteScalar: свойство соединения не было инициализировано
что я пропустил?
я извиняюсь за то, что все еще сомневаюсь..!

защищенный SqlConnection conn;

частная btnHitung_Click недействительным(объект отправителя, EventArgs в электронной)
{
if (int.Метод tryparse(txtBasoSU.Текст, из NumberofOrder))
{
используя (команда sqlcommand cmd и = новая команда sqlcommand("Select Цена от продуктов, где продукт = 'BasoSU'", соед))
{
double BasoSUCost = (двойной)cmd.Executescalar так();

ItemBasoSU = Двойной.Синтаксический анализ(txtBasoSU.Текст);
HargaBasoSU = BasoSUCost * ItemBasoSU;
}
}

OriginalGriff

Пожалуйста, подумайте об этом!
Из вашего исходного кода:

строки strConnect = "сервер=ПК\именем sqlexpress\; базы данных=MyLoginApp;параметр trusted_connection=истина;";
SqlConnection conn = новый SqlConnection();

что, по-вашему, делал этот код, когда вы его писали? :смеяться:

Рейтинг:
11

Muhammad nur Ihsan

Черт возьми, да, я нашел свое решение!!

Загрузить файл form1

public Meja1()
        {
            InitializeComponent();
        }

        SqlConnection con = new SqlConnection(@"Data Source = PC\SQLEXPRESS; Initial Catalog = MyLoginApp; Integrated Security = True");
   
    private void Form1_Load(object sender, EventArgs e)
        {
            con.Open();
            string query = "SELECT * FROM products";
            
            SqlDataAdapter SDA = new SqlDataAdapter(query, con);
            DataTable dt = new DataTable();
            SDA.Fill(dt);
            dataGridView1.DataSource = dt;

            string query2 = "SELECT harga FROM products WHERE Product = 'BasoSU'"; 
            DataSet ds = new DataSet();
            lblBSU.Text = dataGridView1.Rows[0].Cells["Harga"].Value.ToString();
          }


Кнопка Form1

 private void btnHitung_Click(object sender, EventArgs e)
        {
            List<SqlParameter> sqlParams = new List<SqlParameter>();
            DataTable dt = DataAccess.ExecSP("Products", sqlParams);
            SqlConnection conn = new SqlConnection();

            SqlDataAdapter adp = new SqlDataAdapter();
            SqlCommand cmd = new SqlCommand("select * from products",conn);
            adp.SelectCommand = cmd;
            DataSet ds = new DataSet();
            
//declare
Double BasoSUCost; Double ItemBasoSU; Double HargaBasoSU;

if (int.TryParse(txtBasoSU.Text, out NumberofOrder))
            {
                ItemBasoSU = Double.Parse(txtBasoSU.Text);
                BasoSUCost = Double.Parse(lblBSU.Text);
                HargaBasoSU = BasoSUCost * ItemBasoSU; 

             txtTotal.Text = String.Format("Rp. {0:N} ", HargaBasoSU);


это то, что я хочу, это выглядит странно, но это работает! хаха
я использую gridview и label, чтобы использовать его в арифметике lol