Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Хранимая процедура работает в SQL Менеджере, но выдает оишбку в c#  [new]
rockyrock
Member

Откуда:
Сообщений: 2
Добрый вечер!
Как я уже написал в теме у меня следующая проблема - Хранимая процедура работает в SQL Менеджере, но выдает оишбку в c#.
Вот сама хранимая процедура:
ALTER proc [dbo].[s] @t varchar(50),@g varchar(50),@s varchar(50),@w varchar(50),@sem int   as 
insert into SemesterPlan (SubjectID,Semester) values((select ID from Subjects where Name=@s),@sem)
insert into Fixation (SubjectID,GroupID,WorkID,TeacherID,SemesterPlanID) values((select ID from Subjects where Name=@s),(select ID from Groups where Name=@g),(select ID from Works where Name=@w),(select ID from Teachers where Name=@t),(select ID from SemesterPlan where SubjectID=(select ID from Subjects where Name=@s)))

а вот текст ошибки:
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.
Выполнение данной инструкции было прервано.
29 май 14, 22:38    [16094744]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура работает в SQL Менеджере, но выдает оишбку в c#  [new]
SQL Refactor Studio Team
Member

Откуда:
Сообщений: 84
rockyrock
Хранимая процедура работает в SQL Менеджере, но выдает оишбку в c#.

А вы уверены что в SQL Менеджере и в C# процедура вызывается с одинаковыми параметрами?
У Вас какой-то из запросов select X from Y where Name=@Z выдает больше чем одну запись.
29 май 14, 22:56    [16094792]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура работает в SQL Менеджере, но выдает оишбку в c#  [new]
Glory
Member

Откуда:
Сообщений: 104751
rockyrock
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.
Выполнение данной инструкции было прервано.

Полное сообщение об ошибке содержит имя модуля и номер строки, в которой произошла ошибка
29 май 14, 22:59    [16094800]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура работает в SQL Менеджере, но выдает оишбку в c#  [new]
rockyrock
Member

Откуда:
Сообщений: 2
System.Data.SqlClient.SqlException не обработано
HResult=-2146232060
Message=Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.
Выполнение данной инструкции было прервано.
Source=.Net SqlClient Data Provider
ErrorCode=-2146232060
Class=16
LineNumber=3
Number=512
Procedure=s
Server=\\.\pipe\30308ED6-794A-48\tsql\query
State=1
StackTrace:
в System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
в System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
в System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
в System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
в System.Data.SqlClient.SqlDataReader.get_MetaData()
в System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
в System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
в System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
в System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
в System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
в System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
в System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
в System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
в System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
в db.Add.button1_Click(Object sender, EventArgs e) в C:\Users\Ленка\Documents\db\db\Add.cs:строка 42
в System.Windows.Forms.Control.OnClick(EventArgs e)
в System.Windows.Forms.Button.OnClick(EventArgs e)
в System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
в System.Windows.Forms.Control.WndProc(Message& m)
в System.Windows.Forms.ButtonBase.WndProc(Message& m)
в System.Windows.Forms.Button.WndProc(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
в System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
в System.Windows.Forms.Application.Run(Form mainForm)
в db.Program.Main() в C:\Users\Ленка\Documents\db\db\Program.cs:строка 18
в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Threading.ThreadHelper.ThreadStart()
InnerException:
29 май 14, 23:00    [16094802]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура работает в SQL Менеджере, но выдает оишбку в c#  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
rockyrock
Добрый вечер!
Как я уже написал в теме у меня следующая проблема - Хранимая процедура работает в SQL Менеджере, но выдает оишбку в c#.
Вот сама хранимая процедура:
ALTER proc [dbo].[s] @t varchar(50),@g varchar(50),@s varchar(50),@w varchar(50),@sem int   as 
insert into SemesterPlan (SubjectID,Semester) values((select ID from Subjects where Name=@s),@sem)
insert into Fixation (SubjectID,GroupID,WorkID,TeacherID,SemesterPlanID) values((select ID from Subjects where Name=@s),(select ID from Groups where Name=@g),(select ID from Works where Name=@w),(select ID from Teachers where Name=@t),(select ID from SemesterPlan where SubjectID=(select ID from Subjects where Name=@s)))

а вот текст ошибки:
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.
Выполнение данной инструкции было прервано.


Top 1 добавьте во все селекты. Но код конечно редкостное ...
29 май 14, 23:33    [16094891]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура работает в SQL Менеджере, но выдает оишбку в c#  [new]
sh2013
Member

Откуда:
Сообщений: 51
вот она таинственная ....пгозедуга ЭС
rockyrock
ALTER proc [dbo].[s]

может открыть для себя Profiler

я бы ешшо добавил к именам таблиц имена схема
типа
insert into [dbo].SemesterPlan
30 май 14, 07:09    [16095185]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура работает в SQL Менеджере, но выдает оишбку в c#  [new]
Glory
Member

Откуда:
Сообщений: 104751
rockyrock
LineNumber=3
Number=512
Procedure=s

3я строка - это
insert into Fixation (SubjectID,GroupID,WorkID,TeacherID,SemesterPlanID) values((select ID from Subjects where Name=@s),(select ID from Groups where Name=@g),(select ID from Works where Name=@w),(select ID from Teachers where Name=@t),(select ID from SemesterPlan where SubjectID=(select ID from Subjects where Name=@s)))
Это значит, что какой то из запросов select "вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения."
30 май 14, 09:14    [16095380]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура работает в SQL Менеджере, но выдает оишбку в c#  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
Если дубли не предусмотрены бизнес-логикой, создайте уникальные индексы для всех вспомогательных таблиц по ID, NAME.
30 май 14, 12:05    [16096470]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура работает в SQL Менеджере, но выдает оишбку в c#  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Владислав Колосов
Если дубли не предусмотрены бизнес-логикой, создайте уникальные индексы для всех вспомогательных таблиц по ID, NAME.


И чем это поможет запросу
(select ID from Subjects where Name=@s)

возвращать не более одного значения?
30 май 14, 12:19    [16096565]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура работает в SQL Менеджере, но выдает оишбку в c#  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
Очевидно, что при таком индексе более одного в таблицу просто не попадет.
30 май 14, 14:37    [16097731]     Ответить | Цитировать Сообщить модератору
 Re: Хранимая процедура работает в SQL Менеджере, но выдает оишбку в c#  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Владислав Колосов
Очевидно, что при таком индексе более одного в таблицу просто не попадет.

Более одного чего?

create table #t ( ID Int,
                  Name varchar(255))

create unique index idx1  on #t(ID, name)



insert into #t (Id , Name)
   select 1, 'A'

insert into #t (Id , Name)
   select 2, 'A'

insert into #t (Id , Name)
   select 3, 'A'


select ID 
from #t 
where name = 'A'
30 май 14, 15:18    [16098054]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить