Narik2
Дата: 19.04.2007 20:11:29
Уважаемые эксперты.
У меня созрело сомнение в правильности примера приведенного в книге Мэтью, Пшушта
ASP.Net 2. Причем вызывает сомнение не сам компонент доступа к данным, вот он…
public class EmployeeDetails
{
private int employeeID; public int EmployeeID
{ get { return employeeID; } set { employeeID = value; } }
private string firstName; public string FirstName
{ get { return firstName; } set { firstName = value; }}
public EmployeeDetails (int employeeID, string firstName)
{ this.employeeID = employeeID; this.firstName = firstName; }
}
public class EmployeeDB
{
public int InsertEmployee(EmployeeDetails emp)
{
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("InsertEmployee", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@FirstName", SqlDbType.VarChar, 50));
cmd.Parameters["@FirstName"].Value = emp.FirstName;
cmd.Parameters.Add(new SqlParameter("@EmployeeID", SqlDbType.Int, 4));
cmd.Parameters["@EmployeeID"].Direction = ParameterDirection.Output;
try
{
con.Open(); cmd.ExecuteNonQuery();
return (int)cmd.Parameters["@EmployeeID"].Value;
} и так далее..
}
{
А правильность написания хранимой процедуры(все прочие проц. извлечения, удаления и т.д. работают). Вот текст хр. пр.
CREATE PROCEDURE InsertEmployee
@EmployeeID int OUTPUT,
@FirstName varchar(50)
AS INSERT INTO Employees
(EmployeeID, FirstName)
VALUES(@EmployeeID, @FirstName);
SET @EmployeeID=@@IDENTITY
GO
Причем в книге приведен следующий текст
CREATE PROCEDURE InsertEmployee
@EmployeeID int OUTPUT,
@FirstName varchar(50)
AS INSERT INTO Employees
(HireDate, FirstName)
VALUES(GETDATE, @FirstName);
SET @EmployeeID=@@IDENTITY
GO
Который, естествено, не присоединяется(прилепляется, присобачивается) к моей б.д. а исправленный текст, я(после долгих, мучительных усилий) все таки «заэкзекъютил». Кстати, от факта нажатия на эту хитрую кнопку до момента возникновения проблемы прошла героическая неделя. Величие эксперта заключено не столько в его познаниях сколько в умении понять вопрос чайника. Теперь когда я научился впихивать хр. проце-ры в б.д. и пользоваться ими я могу сравнить свои нынешние действия с тем что делал в интербейсе. Если авторы мне не соврали, этот самый «@@IDENTITY» должен обеспечить мне не только авто генерацию EmployeeID но и возврат, в соответствии с методом(функцией) «компонента доступа»
public int InsertEmployee()
(В интербейсе это делал генератор, вызываемый триггером). На деле же я создаю новую запись со значением FirstName а вместо EmployeeID получаю Null. Я могу сперва получить кол-во записей а затем сохранить EmployeeID = Count, но ведь это не выход. Вот процедура вызова метода InsertEmployee
private EmployeeDB db = new EmployeeDB();
protected void Page_Load(object sender, EventArgs e)
{
int empID = db.InsertEmployee(new EmployeeDetails(0, "CleverNarik"));
Label1.Text += "<br />Inserted 1 employee.<br />";
}
В итоге: FirstName = "CleverNarik" а EmployeeID получаю Null.
При возврате(из функции(метода) моего компонента)
return (int)cmd.Parameters["@EmployeeID"].Value;
возникает ошибка так как EmployeeID Null.
Помогите пожа-та…
IAmTonik
Дата: 19.04.2007 20:49:15
не так поняли автора.
@@IDENTITY действительно возвращает имеено то, что вам надо. НО! чтобы это работало, надо создать таблицу такCREATE TABLE [dbo].[Employees](
[ID] [int] IDENTITY(1,1) NOT NULL,
[EmpName] [varchar](100),
CONSTRAINT [PK_CHKHeadNew] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
обратить внимание на [ID] [int] IDENTITY(1,1) NOT NULL,
вот после этого все будет впорядке.
создавать таблицу удобнее в дизайнере. там надо для поля ID задать "Identity Specification"=true
Лиман Артём
Дата: 19.04.2007 21:40:20
И кстати не рекомендую использовать @@IDENTITY впринципе, лучше пусть
войдет в привычку использование SCOPE_IDENTITY(). Про разницу читай в BOL.
________________________________________________
Never ask users what they want or they will tell you
Posted via ActualForum NNTP Server 1.4