Amar chand123 Ответов: 4

Как сохранить данные в базе данных C# winform


Я использую этот код для сохранения данных текстового поля в базу данных, но у меня есть проблема, когда я нажимаю кнопку Сохранить код запуска без каких-либо ошибок и MessageBox показывает "Recourd сохранен",

но данные не сохраняются в моей базе данных,
Я думаю, что проблема не в моем подключении к базе данных, потому что мой код автономера работает нормально

это мой код.
<configuration>
    <configsections>
        <sectiongroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
            <section name="Project1.Properties.Settings">
        
    
    <connectionstrings>
        <add name="Project1.Properties.Settings.DataFileConnectionString" 

  connectionstring="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Data\DataFile.mdf;Integrated Security=True" providername="System.Data.SqlClient"/>
    
    <startup> 
        <supportedruntime version="v4.0" sku=".NETFramework,Version=v4.5">


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

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Configuration;
using System.Data.SqlClient;

namespace Project1
{
    public partial class NewStudantEntry : Form
    {
        public NewStudantEntry()
        {
            InitializeComponent();
        }

        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Project1.Properties.Settings.DataFileConnectionString"].ConnectionString);

        private void NewStudantEntry_Load(object sender, EventArgs e)
        {
            Autonumber();
        }

        // Auto Number in TextBox
        private void Autonumber()
        {
            string Query = "select MAX(StudantNumber) from StudantData";
            SqlCommand cd = new SqlCommand(Query, con);
            try
            {
                con.Open();
                var cont = cd.ExecuteScalar();
                var count = (cont == DBNull.Value ? 1 : Convert.ToInt32(cont) + 1);
                txtStudantNumber.Text = count.ToString("000");
                txtStudantNumber.Enabled = false;

            }

            finally
            {
                con.Close();
            }
        }

        private void SaveRecord()
        {
            string cmdstring = "Insert into StudantData (StudantNumber, ApplicationDate, StudantName, FatherName, Address, Address1, MobileNo, SecMobileNo, City, District, State, PinCode, Remark, UserID) VALUES (@StudantNumber, @ApplicationDate, @StudantName, @FatherName, @Address, @Address1, @MobileNo, @SecMobileNo, @City, @District, @State, @PinCode, @Remark, @UserID)";
            {
                using (SqlCommand cmd = new SqlCommand(cmdstring, con))
                {
                    con.Open();

                    cmd.Parameters.AddWithValue("@StudantNumber", txtStudantNumber.Text);
                    cmd.Parameters.AddWithValue("@ApplicationDate", dtpApplicationDate.Value.Date);
                    cmd.Parameters.AddWithValue("@StudantName", txtStudantName.Text);
                    cmd.Parameters.AddWithValue("@FatherName", txtFatherName.Text);
                    cmd.Parameters.AddWithValue("@Address", txtAddress.Text);
                    cmd.Parameters.AddWithValue("@Address1", txtAddress1.Text);
                    cmd.Parameters.AddWithValue("@MobileNo", txtMobileNo.Text);
                    cmd.Parameters.AddWithValue("@SecMobileNo", txtSecMobileNo.Text);
                    cmd.Parameters.AddWithValue("@City", txtCity.Text);
                    cmd.Parameters.AddWithValue("@District", txtDist.Text);
                    cmd.Parameters.AddWithValue("@State", txtState.Text);
                    cmd.Parameters.AddWithValue("@PinCode", txtPinCode.Text);
                    cmd.Parameters.AddWithValue("@Remark", txtRemark.Text);
                    cmd.Parameters.AddWithValue("@UserID", "Admin");

                    cmd.ExecuteNonQuery();
                    MessageBox.Show("Recourd is saved", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    con.Close();
                }
            }
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            SaveRecord();
        }
    }
}

4 Ответов

Рейтинг:
2

OriginalGriff

Не делайте "автономер" таким образом: это рецепт для некоторых действительно неприятных ошибок. SQL Server-это многопользовательская база данных, поэтому вполне возможно, что между запросом наибольшего числа и записью ваших данных любое количество других пользователей может сделать то же самое. Все, что требуется, - это одна пара пользователей, чтобы получить один и тот же номер, и данные в вашей базе данных могут начать серьезно компрометироваться.

Вместо этого используйте поле IDENTITY в SQL Server (или UNIQUEIDENTIFIER) и позвольте SQL Server разобраться в уникальности - он все сделает правильно! Это также намного эффективнее, чем две поездки туда и обратно в SQL ...

Что касается проблемы, которую вы заметили, то, как говорит Гарт, отладчик-это место для начала. Но если предположить, что вы действительно получаете окно сообщения "Recourd is saved" (sic), то вам нужно посмотреть, как вы определяете, что строка не сохраняется: почему вы так уверены, что это не так? Поскольку вы получаете MessageBox, вы не получаете исключения в этом коде - что означает, что вы не смотрите в нужное место, когда проверяете!


Amar chand123

Когда я изменить "источник данных=(на localdb)\MSSQLLocalDB;ключевое слово attachdbfilename=|параметр datadirectory|\сведения\файл данных.МДФ;Комплексная безопасность=истина"
к
"Данные Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\HP\source\repos\Project1\Project1\Data\DataFile.mdf;Интегрированная безопасность=True"

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

OriginalGriff

Как вы думаете, почему?
Как вы думаете, есть ли вероятность того, что SQL Server будет искать базы данных в папке вашего проекта? Или вы думаете, что он хранит отдельную папку для своих баз данных, называемую "|DataDirectory|"?

И еще две детали:
1) Никогда не жестко кодируйте строки подключения - всегда используйте конфигурационный файл, иначе вам придется менять строку в нескольких местах для каждой установки, и это Пита.
2) Не подключайте базы данных - это специальная функция отладки, которая применима только к экспресс-выпускам Sql Server, и она потерпит массовую неудачу, если вы попытаетесь использовать ее в коде выпуска (а также создать несколько копий многопользовательской базы данных). Передайте базу данных SQL Server, и пусть он вместо этого позаботится о ней в своем DataDirectory.

Рейтинг:
1

Richard MacCutchan

Вы совершаете классическую ошибку, неправильно используя код. Как вы можете видеть из Свойство sqlcommand.Метод ExecuteNonQuery (System.Data.SqlClient) | Microsoft Docs[^], есть возвращаемое значение, чтобы сказать вам, сработало оно или нет. Но вы проигнорировали это и просто предположили, что это сработало. Никогда не публикуйте сообщения об успехе, если вы сначала не проверите результат вызова метода.


Amar chand123

Когда я изменить "источник данных=(на localdb)\MSSQLLocalDB;ключевое слово attachdbfilename=|параметр datadirectory|\сведения\файл данных.МДФ;Комплексная безопасность=истина"
к
"Данные Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\HP\source\repos\Project1\Project1\Data\DataFile.mdf;Интегрированная безопасность=True"

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

Richard MacCutchan

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

Рейтинг:
1

Garth J Lancaster

Я думаю, что вы должны использовать свой отладчик и абсолютно убедиться, что ваш код в SaveRecord() выполняется.

Установите точку останова на этой линии

string cmdstring = "Insert into StudantData (StudantNumber, ApplicationDate, StudantName, FatherName, Address, Address1, MobileNo, SecMobileNo, City, District, State, PinCode, Remark, UserID) VALUES (@StudantNumber, @ApplicationDate, @StudantName, @FatherName, @Address, @Address1, @MobileNo, @SecMobileNo, @City, @District, @State, @PinCode, @Remark, @UserID)";
затем один шаг и посмотреть, что произойдет

кстати, не используя try...catch...наконец, в SaveRecord ? Опасный


Рейтинг:
1

Dave Kreskowiak

<add name="Project1.Properties.Settings.DataFileConnectionString" 

="" connectionstring="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Data\DataFile.mdf;Integrated Security=True" providername="System.Data.SqlClient">


Есть еще один лишний ="" в файле app.config. Удалите это, так как это может быть связано с синтаксическим анализатором XML для конфигурационного файла.

Кроме того, закрывающий тег для add бирка отсутствует. Добавьте косую черту в конец строки, непосредственно перед началом строки. >.

<add name="Project1.Properties.Settings.DataFileConnectionString" 
    connectionstring="Data Source=LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Data\DataFile.mdf;Integrated Security=True"
    providername="System.Data.SqlClient" />


Amar chand123

Проблема все та же

Dave Kreskowiak

Я не говорил, что это было решение проблемы. Я просто указываю на то, что явно неправильно.

Dave Kreskowiak

Во - первых, каждый раз, когда вы запускаете приложение под отладчиком в Visual Studio, ваш файл базы данных перезаписывается копией, которая есть в проекте. Сохраненные данные сохраняются в копии в DataDirectory. При следующем запуске приложения на отладчике эта копия перезаписывается, уничтожая данные, сохраненные при предыдущем запуске.