volkihar
@volkihar

Почему хранимая процедура не выполняется при вызове из C# (работает только из SQL)?

Есть такая таблица:
CREATE TABLE [dbo].[DataAdditional] (
    [Id]              INT            IDENTITY (1, 1) NOT NULL,
    [Alpha]        INT            NULL,
    [Bravo]        BIGINT      NULL,
    [Charlie]      BIGINT      NULL,
    [Delta]        INT            NULL,
    [Echo]         INT            NULL,
    [Foxtrot]     INT            NULL,
    [Golf]          INT            NULL,
    [Hotel]        NVARCHAR (MAX) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

И такая процедура:
CREATE PROCEDURE [dbo].[AddAdditionalData]
   @alpha int = 0,
   @bravo bigint = 0,
   @Charlie bigint = 0,
    @Delta int = 0,
    @Echo int = 0,
    @Foxtrot int = 0,
    @Golf int = 0,
    @Hotel nvarchar(max) = N''            	
AS
BEGIN
	INSERT INTO dbo.DataAdditional(Alpha, Bravo, Charlie, Delta, Echo, Foxtrot, Golf, Hotel)
	--VALUES (@alpha, @bravo, @Charlie, @Delta, @Echo, @Foxtrot, @Golf, @Hotel) --Не работает --
	VALUES (23651, 12587156333, 99999, 2321, 2, 21, 4, N'Значимость этих проблем настолько очевидна, что сложившаяся структура организации создаёт...                                                                                                                                                                
')
END

--exec dbo.AddAdditionalData 23651, 12587156333, 99999, 2321, 2, 21, 4, N'Значимость этих проблем настолько очевидна, что сложившаяся структура организации создаёт...                                                                                                                                                                  ' --
--вот этот exec работает
exec dbo.AddAdditionalData
-- а этот работает если раскоменчин второй VALUES, а первый закоменчен.

Так вызываю процедуру из C#:
public void AddSecondData(MainWindow.DataSecond dataSecond)
        {
            //ClearData();
            using (SqlConnection con = new SqlConnection(ConnectionString))
            {
                using (SqlCommand cmd = new SqlCommand("dbo.AddAdditionalData", con))//без dbo тоже пробовал
                {
                    cmd.CommandType = CommandType.StoredProcedure;

                    cmd.Parameters.Add("@alpha", SqlDbType.Int).Value = dataSecond.Alpha;
                    cmd.Parameters.Add("@bravo", SqlDbType.BigInt).Value = Convert.ToInt64(dataSecond.Bravo);
                    cmd.Parameters.Add("@Charlie", SqlDbType.BigInt).Value = Convert.ToInt64(dataSecond.Charlie);
                    cmd.Parameters.Add("@Delta", SqlDbType.Int).Value = dataSecond.Delta;
                    cmd.Parameters.Add("@Echo", SqlDbType.Int).Value = dataSecond.Echo;
                    cmd.Parameters.Add("@Foxtrot", SqlDbType.Int).Value = dataSecond.Foxtrot;
                    cmd.Parameters.Add("@Golf", SqlDbType.Int).Value = dataSecond.Golf;
                    cmd.Parameters.Add("@Hotel", SqlDbType.NVarChar).Value = dataSecond.Hotel;

                    if (cmd.Connection.State == ConnectionState.Closed)
                    {
                        cmd.Connection.Open();
                    }
                    cmd.ExecuteNonQuery();
                    // пробовал завернуть в try catch, но никаких exception не получил.
                }
            }
        }


Вряд-ли проблема в этом, но DataSecond выглядит так

public class DataSecond
        {
            public int Alpha;
            public long Bravo;
            public long Charlie;
            public int Delta;
            public int Echo;
            public int Foxtrot;
            public int Golf;
            public string Hotel;
         }


БД создавал через контекстное меню в VS. Подключение есть, перед выполнением процедуры проверяю.
Почему так? Даже никаких ошибок при выполнения метода нет. Просто таблица не заполняется. Даже default значения не ставятся. Хотя процедура из C# точно вызывается.

UPD:
Скорее всего проблема в самом C#. Так как после вызова процедуры через него, и обновления таблицы (чтобы данные посмотреть) получаю:

This database cannot be imported. It is either an unsupported SQL server version or an unsupported database compatibility.

Погуглил, вроде так решается:
public void AddSecondData(MainWindow.DataSecond dataSecond)
        {
                SqlConnection connection = GetConnection();

                using (SqlCommand cmd = new SqlCommand("dbo.AddAdditionalData", con))
                    cmd.CommandType = CommandType.StoredProcedure;

                    cmd.Parameters.Add("@alpha", SqlDbType.Int).Value = dataSecond.Alpha;
                    cmd.Parameters.Add("@bravo", SqlDbType.BigInt).Value = Convert.ToInt64(dataSecond.Bravo);
                    cmd.Parameters.Add("@Charlie", SqlDbType.BigInt).Value = Convert.ToInt64(dataSecond.Charlie);
                    cmd.Parameters.Add("@Delta", SqlDbType.Int).Value = dataSecond.Delta;
                    cmd.Parameters.Add("@Echo", SqlDbType.Int).Value = dataSecond.Echo;
                    cmd.Parameters.Add("@Foxtrot", SqlDbType.Int).Value = dataSecond.Foxtrot;
                    cmd.Parameters.Add("@Golf", SqlDbType.Int).Value = dataSecond.Golf;
                    cmd.Parameters.Add("@Hotel", SqlDbType.NVarChar).Value = dataSecond.Hotel;

                    if (cmd.Connection.State == ConnectionState.Closed)
                    {
                        cmd.Connection.Open();
                    }
                    cmd.ExecuteNonQuery();
                    // пробовал завернуть в try catch, но никаких exception не получил.
                }            
        }

        private SqlConnection GetConnection()
        {
            SqlConnectionStringBuilder connectionString = new SqlConnectionStringBuilder();
            connectionString.DataSource = "(localdb)\\MSSQLLocalDB";
            connectionString.AttachDBFilename = "|DataDirectory|\\MainDB.mdf";
            connectionString.IntegratedSecurity = true;
            string connectString = connectionString.ConnectionString;

            SqlConnection connection = new SqlConnection(connectString);
            return connection;
            //return @"data source=(LocalDB)\MSSQLLocalDB;attachdbfilename=|DataDirectory|\MainDB.mdf;MultipleActiveResultSets=True;";

            //return @"Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=MainDB;"
            //    + "Integrated Security=true;";
        }

но это не помогло.

UPD 2:
Проблема 100% в C#. Создал процедуру которая удаляет все из таблицы, вручную добавил данные в таблицу и так же вызываю из C# новую процедуру. Ничего не удалилось и ошибок никаких нет(try catch тоже ничего не показывает).
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
volkihar
@volkihar Автор вопроса
Приношу свои извинения за этот вопрос. Проблема была не в коде. Я смотрел на .mdf файл который находится в Solution Explorer и в Server Explorer.
Оказалось, что есть еще один файл, которой находится в ProjectName/bin/Debug/Main.mdf.
Именно туда все запросы и идут. Но я его не создавал. Вообще не понимаю как он там оказался, и почему после обновления .sql скриптов в первой .mdf базе они и там обновлялись.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
samodum
@samodum
Если убрать PRIMARY KEY CLUSTERED ([Id] ASC)
то всё заработает
CREATE TABLE [dbo].[DataAdditional] (
    [Id]              INT            IDENTITY (1, 1) NOT NULL,
    [Alpha]        INT            NULL,
    [Bravo]        BIGINT      NULL,
    [Charlie]      BIGINT      NULL,
    [Delta]        INT            NULL,
    [Echo]         INT            NULL,
    [Foxtrot]     INT            NULL,
    [Golf]          INT            NULL,
    [Hotel]        NVARCHAR (MAX) NULL
  -- , PRIMARY KEY CLUSTERED ([Id] ASC)
);

Проблема в этой строке
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы