Я впервые строю простую систему ERP, используя С# и SQL Server. Я пытаюсь проверить, существует ли уже значение из textBox в базе данных; когда форма и ввод в поля, я получаю исключение
Вот функция проверки:
private void txtRef_Validated(object sender, EventArgs e)
{
BL.CLS_PRODUCTS prd = new BL.CLS_PRODUCTS();
DataTable Dt = new DataTable();
Dt = prd.VarifyProductID(txtRef.Text);
if (Dt.Rows.Count > 0)
{
MetroMessageBox.Show(this, "الصنف موجود مسبقاً", "تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtRef.Focus();
txtRef.SelectionStart = 0;
txtRef.SelectionLength = txtRef.Text.Length;
}
}
Таблица данных, которая останавливается на
da.Fill(dt);
public DataTable SelectData(string stored_procedure, SqlParameter[] param)
{
SqlCommand sqlcmd = new SqlCommand();
sqlcmd.CommandType = CommandType.StoredProcedure;
sqlcmd.CommandText = stored_procedure;
sqlcmd.Connection = sqlconnection;
if (param != null)
{
for (int i = 0; i < param.Length; i++)
{
sqlcmd.Parameters.Add(param[i]);
}
}
SqlDataAdapter da = new SqlDataAdapter(sqlcmd);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
и вот моя функция проверки проверки:
public DataTable VerifyProductID(string ID)
{
DAL.DataAccessLayer DAL = new DAL.DataAccessLayer();
DataTable Dt = new DataTable();
SqlParameter[] param = new SqlParameter[1];
param[0] = new SqlParameter("@ID", SqlDbType.VarChar, 50);
param[0].Value = ID;
Dt = DAL.SelectData("VerifyProductID", null);
DAL.Close();
return Dt;
}
Хранимая процедура SQL Server:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[VerifyProductID]
@ID VARCHAR(50)
AS
SELECT *
FROM PRODUCTS
WHERE ID = @ID
Исключение:
System.Data.SqlClient.SqlException не был обработан кодом пользователя
HResult = -2146232060
Сообщение = процедура или функция "VerifyProductID" ожидает параметр "@ID", который не был предоставлен.
Источник =.Net SqlClient Data Provider
ErrorCode = -2146232060
Класс = 16
LineNumber = 0
Количество = 201
Процедура = VerifyProductID
Server =.\SQLEXPRESS
State = 4Трассировки стека:
в System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection, действие1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean, Boolean callerHasConnectionLock 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, логическое returnStream, логическое асинхронное, Int32 тайм-аут, задача и задача, логическое asyncWrite, SqlDataReader ds) в System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, логический возвратный поток, метод String, системный вызов времени для поиска и прерывания, системный запрос на завершение выполнения для задачи) DATA поведение) в System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader (поведение CommandBehavior) в System.Data.Common.DbDataAdapter.FillInternal (набор данных DataSet, DataTable [] datatables, int32 startRecord, Int32 maxRecTable, String maxRecc, String maxRecc, String Команда IDbCommand, поведение CommandBehavior) в System.Data.Common.DbDataAdapter.Fill(DataTable [] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand команда, поведение CommandBehavior) в System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) в E_AND_M.DAL.DataAccessLayer.SelectData (строка хранимого_процедура, SqlParameter [] param) в c:\Users\kh\Documents\Visual Studio 2012\Проекты\E_AND_M\E_AND_M\DAL\DataAccessLayer.cs: строка 58 в E_AND_M.BL.CLS_PRODUCTS.VarifyProductID (идентификатор строки) в c:\Users\kh\Documents\Visual Studio 2012\Проекты\E_AND_M\E_AND_M\BL\CLS_PRODUC. cs: строка 49 в E_AND_M.PL.FRM_ADD_PROUDECT.txtRef_Validated (Отправитель объекта, EventArgs e) в c:\Users\kh\Documents\Visual Studio 2012\Projects\E_AND_M\E_AND_M\PL\FRM_ADD_PROUDECT.cs: строка 33 в системе. Windows.Forms.Control.OnValidated(EventArgs e) в System.Windows.Forms.Control.PerformControlValidation(Boolean bulkValidation) в System.Windows.Forms.ContainerControl.ValidateThroughAncestor (Управляющий элемент ancestorControl, BooleanExceptionCorror: предотвращение фокуса)
Dt = DAL.SelectData("VarifyProductID", null);
должно быть
Dt = DAL.SelectData("VarifyProductID", param);