bartall Ответов: 2

Мой код показывает ошибку при вставке данных из C# в mssql


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

Например:
(команда.Executescalar так())
"sqlexception был необработан"
Необработанное исключение типа "System.Data.SqlClient.SqlException" произошло в System.Data.dll


Мой код находится ниже:
App.Config:код

<pre><?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="Adipocytes_Diplomamunka.Properties.Settings.LipdatConnectionString"

            connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Lipdat.mdf;Integrated Security=True"

            providerName="System.Data.SqlClient" />
    </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>



using System.Configuration;
using System.Data.SqlClient;
SqlConnection connection;
string connectionString;

        public Form1()
        {
            InitializeComponent();
            connectionString = ConfigurationManager.ConnectionStrings["Adipocytes_Diplomamunka.Properties.Settings.LipdatConnectionString"].ConnectionString;


        }

 private void button2_Click(object sender, EventArgs e)
        {

            SQLSU();
        }    

        private void SQLSU()
        {

            string query = "INSERT INTO Result VALUES(@ID, @Filename)";
            using (connection = new SqlConnection(connectionString))
            using (SqlCommand command = new SqlCommand(query, connection))
            {

                    connection.Open();

                    command.Parameters.AddWithValue("@ID", cnt);
                    command.Parameters.AddWithValue("@Filename", FileNa);
                    command.ExecuteScalar();

            }                     
        }


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

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

F-ES Sitecore

Если вы не возвращаете данные, то используйте ExecuteNonQuery, а не ExecuteScalar. Также проверьте, что cnt является допустимым идентификатором, что FileNa содержит текст, и убедитесь, что результирующая таблица имеет только поле ID и Filename и что ID не является столбцом идентификаторов.

2 Ответов

Рейтинг:
2

OriginalGriff

Для начала вам нужно использовать отладчик, чтобы посмотреть на само исключение, а именно на свойство InnerException, которое, вероятно, даст вам больше информации о том, что именно произошло.

Есть довольно много возможностей.

1) код, который вы показываете, не показывает, что в него вкладывается какое-либо значение FileNa или cnt поэтому используйте отладчик, чтобы посмотреть на переменные и точно выяснить, что они содержат. cnt вероятно, это целое число, так что оно будет иметь значение, но FileNa вероятно, это строка, и по умолчанию она будет иметь нулевое значение, что может не понравиться SQL. Единственный способ убедиться в этом - использовать отладчик.

2) соответствуют ли ваши столбцы значениям? Вы не указываете имена столбцов в инструкции INSERT, поэтому SQL будет начинаться с "первого" столбца и заполняться оттуда. Если у вас есть более 2 столбцов, есть хороший шанс, что порядок не совпадает. Всегда перечислите имена столбцов во вставке или обновлении (а также в выборе), чтобы избежать этого.

3) ID подразумевает идентификатор строки - и если у вас есть столбец IDENTITY в вашей БД, то вы можете указать его самостоятельно, и SQL выдаст исключение, если вы попытаетесь.

4) Если ID-это идентификатор строки, а не IDENTITY, то вы совершаете большую ошибку: ваш код будет работать в dev, где его используете только вы, но периодически будет выходить из строя в производстве и вызывать некоторые действительно неприятные проблемы целостности БД. Никогда не "предварительно назначайте" идентификаторы - позвольте БД сделать это и получить их после успешной вставки, если они вам нужны.


Рейтинг:
1

Gerry Schmitz

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

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


Richard Deeming

В этом нет ничего плохого. using заявления. Дело в том, что SqlConnection объявленный как поле вместо локальной переменной оставляет место для улучшения, но ничто не мешает этому коду компилироваться.