SQL Server и.NET: вставьте сбои (тихо!) в коде, но не, когда выполнено вручную

Это - определенно что-то с GUI, потому что у меня была та же проблема, но метод, описанный в http://deathofagremmie.com/2012/05/01/mounting-a-synology-diskstation-on-ubuntu-12.04/ , хорошо работал - по крайней мере, для присоединения к моей Buffalo TeraStation в моей локальной сети. Не может сказать, будет ли это работать в AD среде.

8
задан Tom H 8 July 2010 в 16:06
поделиться

6 ответов

Столбец идентификаторов будет увеличиваться при каждой попытке вставки, даже если она не удалась, так что эта часть не обязательно является необычной.

Я бы поискал проблемы со значениями ваших параметров и / или введите arrParams. Что за объект "данные"? (Я почти боюсь спрашивать, но я не получаю никаких обращений к msdn для ExecuteIntScalar)

РЕДАКТИРОВАТЬ:

Я думаю, что van находится на правильном пути в отношении транзакции, которая не фиксируется. Это похоже на то, что вы используете какой-то специальный вспомогательный класс для управления вызовами хранимых процедур в базе данных (и, по-видимому, другим доступом к БД), и возможно, этот код проглатывает ошибку, вызванную SQL-сервером. Я создал небольшое тестовое приложение и смог воспроизвести описанное вами поведение. Поскольку мы не можем сказать, как ваш класс перехватывает исключения и т. Д. Возможно, это и не ваша настоящая проблема, но это один из способов, при помощи которого вызов хранимой процедуры может завершиться неудачно так, как вы описываете.

// call the proj_ins_all SP every time a button is clicked.
protected void Button1_Click(object sender, EventArgs e)
{
    using (SqlConnection conn = new SqlConnection(myConnectionString))
    using (SqlCommand cmd = new SqlCommand("proj_ins_all", conn))
    {
        try
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@proj_number", SqlDbType.Int));
            cmd.Parameters["@proj_number"].Value = 9001810;
            cmd.Parameters.Add(new SqlParameter("@usr_id", SqlDbType.Int));
            cmd.Parameters["@usr_id"].Value = 2;
            cmd.Parameters.Add(new SqlParameter("@download", SqlDbType.SmallDateTime));
            cmd.Parameters["@download"].Value = "2009-09-03 16:20:11";
            cmd.Parameters.Add(new SqlParameter("@status", SqlDbType.Int));
            cmd.Parameters["@status"].Value = 2;

            conn.Open();
            cmd.Transaction = conn.BeginTransaction();

            object _id = cmd.ExecuteScalar();

            // _id now contains the value of the Identity column for
            // the row just inserted by proj_ins_all

            // Assume (or simulate) an error is raised after the SP is called but
            // before the transaction is committed.
            // (Comment this line out and the DB update succeeds, as expected.)
            throw new Exception();

            // If the transaction is not committed, it'll be rolled back when
            // the connection is closed and the inserted row won't be in the
            // table even though the incremented Identity value was returned above.
            cmd.Transaction.Commit();

        }
        catch (Exception)
        {
            // "swallow" (i.e. just ignore) any errors raised by the DB code.
            //throw;
        }
    }

}

Транзакции не должны быть явно объявлены как произошедшие. Например, если вы удалите вызовы BeginTransaction () и Transaction.Commit () из приведенного выше кода, все равно будет существовать неявная транзакция, которая теоретически может быть прервана и вызвана откатом. Таким образом, корень вашей проблемы может быть более тонким, чем этот пример, который требует явной транзакции для демонстрации концепции.

На практике вы можете увидеть (через Profiler) фактический SQL, который приложение отправляет на сервер SQL, и проверить что он работает при выполнении из SSMS, поэтому я думаю, что проблема, вероятно, связана с кодом приложения, вызывающим хранимую процедуру.

s один из способов, по которым вызов хранимой процедуры может завершиться неудачно, как вы описываете.

// call the proj_ins_all SP every time a button is clicked.
protected void Button1_Click(object sender, EventArgs e)
{
    using (SqlConnection conn = new SqlConnection(myConnectionString))
    using (SqlCommand cmd = new SqlCommand("proj_ins_all", conn))
    {
        try
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@proj_number", SqlDbType.Int));
            cmd.Parameters["@proj_number"].Value = 9001810;
            cmd.Parameters.Add(new SqlParameter("@usr_id", SqlDbType.Int));
            cmd.Parameters["@usr_id"].Value = 2;
            cmd.Parameters.Add(new SqlParameter("@download", SqlDbType.SmallDateTime));
            cmd.Parameters["@download"].Value = "2009-09-03 16:20:11";
            cmd.Parameters.Add(new SqlParameter("@status", SqlDbType.Int));
            cmd.Parameters["@status"].Value = 2;

            conn.Open();
            cmd.Transaction = conn.BeginTransaction();

            object _id = cmd.ExecuteScalar();

            // _id now contains the value of the Identity column for
            // the row just inserted by proj_ins_all

            // Assume (or simulate) an error is raised after the SP is called but
            // before the transaction is committed.
            // (Comment this line out and the DB update succeeds, as expected.)
            throw new Exception();

            // If the transaction is not committed, it'll be rolled back when
            // the connection is closed and the inserted row won't be in the
            // table even though the incremented Identity value was returned above.
            cmd.Transaction.Commit();

        }
        catch (Exception)
        {
            // "swallow" (i.e. just ignore) any errors raised by the DB code.
            //throw;
        }
    }

}

Транзакции не должны быть явно объявлены выполненными. Например, если вы удалите вызовы BeginTransaction () и Transaction.Commit () из приведенного выше кода, все равно будет существовать неявная транзакция, которая теоретически может быть прервана и вызвана откатом. Таким образом, корень вашей проблемы может быть более тонким, чем этот пример, который требует явной транзакции для демонстрации концепции.

На практике вы можете увидеть (через Profiler) фактический SQL, который приложение отправляет на сервер SQL, и проверить что он работает при запуске из SSMS, поэтому я думаю, что проблема, вероятно, связана с кодом приложения, вызывающим хранимую процедуру.

s один из способов, по которым вызов хранимой процедуры может завершиться неудачно, как вы описываете.

// call the proj_ins_all SP every time a button is clicked.
protected void Button1_Click(object sender, EventArgs e)
{
    using (SqlConnection conn = new SqlConnection(myConnectionString))
    using (SqlCommand cmd = new SqlCommand("proj_ins_all", conn))
    {
        try
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@proj_number", SqlDbType.Int));
            cmd.Parameters["@proj_number"].Value = 9001810;
            cmd.Parameters.Add(new SqlParameter("@usr_id", SqlDbType.Int));
            cmd.Parameters["@usr_id"].Value = 2;
            cmd.Parameters.Add(new SqlParameter("@download", SqlDbType.SmallDateTime));
            cmd.Parameters["@download"].Value = "2009-09-03 16:20:11";
            cmd.Parameters.Add(new SqlParameter("@status", SqlDbType.Int));
            cmd.Parameters["@status"].Value = 2;

            conn.Open();
            cmd.Transaction = conn.BeginTransaction();

            object _id = cmd.ExecuteScalar();

            // _id now contains the value of the Identity column for
            // the row just inserted by proj_ins_all

            // Assume (or simulate) an error is raised after the SP is called but
            // before the transaction is committed.
            // (Comment this line out and the DB update succeeds, as expected.)
            throw new Exception();

            // If the transaction is not committed, it'll be rolled back when
            // the connection is closed and the inserted row won't be in the
            // table even though the incremented Identity value was returned above.
            cmd.Transaction.Commit();

        }
        catch (Exception)
        {
            // "swallow" (i.e. just ignore) any errors raised by the DB code.
            //throw;
        }
    }

}

Транзакции не должны быть явно объявлены выполненными. Например, если вы удалите вызовы BeginTransaction () и Transaction.Commit () из приведенного выше кода, все равно будет существовать неявная транзакция, которая теоретически может быть прервана и вызвана откатом. Таким образом, корень вашей проблемы может быть более тонким, чем этот пример, который требует явной транзакции для демонстрации концепции.

На практике вы можете увидеть (через Profiler) фактический SQL, который приложение отправляет на сервер SQL, и проверить что он работает при выполнении из SSMS, поэтому я думаю, что проблема, вероятно, связана с кодом приложения, вызывающим хранимую процедуру.

// call the proj_ins_all SP every time a button is clicked.
protected void Button1_Click(object sender, EventArgs e)
{
    using (SqlConnection conn = new SqlConnection(myConnectionString))
    using (SqlCommand cmd = new SqlCommand("proj_ins_all", conn))
    {
        try
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@proj_number", SqlDbType.Int));
            cmd.Parameters["@proj_number"].Value = 9001810;
            cmd.Parameters.Add(new SqlParameter("@usr_id", SqlDbType.Int));
            cmd.Parameters["@usr_id"].Value = 2;
            cmd.Parameters.Add(new SqlParameter("@download", SqlDbType.SmallDateTime));
            cmd.Parameters["@download"].Value = "2009-09-03 16:20:11";
            cmd.Parameters.Add(new SqlParameter("@status", SqlDbType.Int));
            cmd.Parameters["@status"].Value = 2;

            conn.Open();
            cmd.Transaction = conn.BeginTransaction();

            object _id = cmd.ExecuteScalar();

            // _id now contains the value of the Identity column for
            // the row just inserted by proj_ins_all

            // Assume (or simulate) an error is raised after the SP is called but
            // before the transaction is committed.
            // (Comment this line out and the DB update succeeds, as expected.)
            throw new Exception();

            // If the transaction is not committed, it'll be rolled back when
            // the connection is closed and the inserted row won't be in the
            // table even though the incremented Identity value was returned above.
            cmd.Transaction.Commit();

        }
        catch (Exception)
        {
            // "swallow" (i.e. just ignore) any errors raised by the DB code.
            //throw;
        }
    }

}

Транзакции не нужно явно декларировать. Например, если вы удалите вызовы BeginTransaction () и Transaction.Commit () из приведенного выше кода, все равно будет существовать неявная транзакция, которая теоретически может быть прервана и вызвана откатом. Таким образом, корень вашей проблемы может быть более тонким, чем этот пример, который требует явной транзакции для демонстрации концепции.

На практике вы можете увидеть (через Profiler) фактический SQL, который приложение отправляет на сервер SQL, и проверить что он работает при выполнении из SSMS, поэтому я думаю, что проблема, вероятно, связана с кодом приложения, вызывающим хранимую процедуру.

// call the proj_ins_all SP every time a button is clicked.
protected void Button1_Click(object sender, EventArgs e)
{
    using (SqlConnection conn = new SqlConnection(myConnectionString))
    using (SqlCommand cmd = new SqlCommand("proj_ins_all", conn))
    {
        try
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@proj_number", SqlDbType.Int));
            cmd.Parameters["@proj_number"].Value = 9001810;
            cmd.Parameters.Add(new SqlParameter("@usr_id", SqlDbType.Int));
            cmd.Parameters["@usr_id"].Value = 2;
            cmd.Parameters.Add(new SqlParameter("@download", SqlDbType.SmallDateTime));
            cmd.Parameters["@download"].Value = "2009-09-03 16:20:11";
            cmd.Parameters.Add(new SqlParameter("@status", SqlDbType.Int));
            cmd.Parameters["@status"].Value = 2;

            conn.Open();
            cmd.Transaction = conn.BeginTransaction();

            object _id = cmd.ExecuteScalar();

            // _id now contains the value of the Identity column for
            // the row just inserted by proj_ins_all

            // Assume (or simulate) an error is raised after the SP is called but
            // before the transaction is committed.
            // (Comment this line out and the DB update succeeds, as expected.)
            throw new Exception();

            // If the transaction is not committed, it'll be rolled back when
            // the connection is closed and the inserted row won't be in the
            // table even though the incremented Identity value was returned above.
            cmd.Transaction.Commit();

        }
        catch (Exception)
        {
            // "swallow" (i.e. just ignore) any errors raised by the DB code.
            //throw;
        }
    }

}

Транзакции не нужно явно декларировать. Например, если вы удалите вызовы BeginTransaction () и Transaction.Commit () из приведенного выше кода, все равно будет существовать неявная транзакция, которая теоретически может быть прервана и вызвана откатом. Таким образом, корень вашей проблемы может быть более тонким, чем этот пример, который требует явной транзакции для демонстрации концепции.

На практике вы можете увидеть (через Profiler) фактический SQL, который приложение отправляет на сервер SQL, и проверить что он работает при выполнении из SSMS, поэтому я думаю, что проблема, вероятно, связана с кодом приложения, вызывающим хранимую процедуру.

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

На практике вы можете увидеть (через Profiler) фактический SQL, который приложение отправляет на сервер SQL, и проверить что он работает при выполнении из SSMS, поэтому я думаю, что проблема, вероятно, связана с кодом приложения, вызывающим хранимую процедуру.

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

На практике вы можете увидеть (через Profiler) фактический SQL, который приложение отправляет на сервер SQL, и проверить что он работает при запуске из SSMS, поэтому я думаю, что проблема, вероятно, связана с кодом приложения, вызывающим хранимую процедуру.

6
ответ дан 5 December 2019 в 10:43
поделиться

Либо ваша транзакция не зафиксирована , либо создается исключение, которое просто съедается (игнорируется).

6
ответ дан 5 December 2019 в 10:43
поделиться

Включите профилировщик сервера sql, чтобы увидеть, что происходит в базе данных.

3
ответ дан 5 December 2019 в 10:43
поделиться

Возможно, вы откатываете транзакцию. Это объяснило бы, почему строки нет. Я не думаю, что proj_ins_all дает сбой, если вы видите, что переменная _id установлена. Если бы возникло исключение, этого бы не произошло. Таким образом, транзакция должна быть действующей и откатывается.

1
ответ дан 5 December 2019 в 10:43
поделиться

Если у вас есть значение DateTime в C #, оно будет передано в SQL Server как DATETIME как есть.

Если у вас есть строковое значение в C #, которое вы хотите передать как параметр DATETIME, оно пройдет через некоторые Вуду преобразования локализации в зависимости от настроек языка / культуры вашей ОС и вашей БД.

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

0
ответ дан 5 December 2019 в 10:43
поделиться

Цитата

Ошибка преобразования типа данных varchar в datetime.

Поскольку я тестировал его вручную, я просто сократил datetime с '2009-09-03 16: 20: 11.7130000' на '2009-09-03 16:20:11', и это исправило ошибку; теперь строка вставлена ​​нормально.

Blockquote Это ошибка профилировщика SQL. http://support.microsoft.com/kb/974289/

0
ответ дан 5 December 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: