#c# #asp.net #sql-server #stored-procedures
#c# #asp.net #sql-сервер #хранимые процедуры
Вопрос:
Я пытаюсь вставить данные в свою таблицу. Я создал хранимую процедуру, которая будет это делать. Я также создал метод, который вызывает хранимую процедуру. Когда я нажимаю на кнопку отправки, запускается событие click, и я получаю входные данные и вызываю метод для вставки в таблицу.
Я не получаю ошибок, но когда я проверяю в своей базе данных, данные не были вставлены.
Я попытался выполнить хранимую процедуру вручную, и она действительно работает.
Вот моя хранимая процедура:
CREATE PROCEDURE [dbo].AddRestaurant
@theName VARCHAR(250),
@theAddr VARCHAR(350),
@theCity VARCHAR(50),
@theState VARCHAR(2),
@theZip VARCHAR(5),
@theCategory INT
AS
BEGIN
INSERT INTO Restaurants (RestName, RestAddr, RestCity, RestState, RestZip, CategoryID)
VALUES (@theName, @theAddr, @theCity, @theState, @theZip, @theCategory)
END
Вот моя структура таблицы:
CREATE TABLE [dbo].[Restaurants]
(
[RestaurantID] INT IDENTITY (1, 1) NOT NULL,
[RestName] VARCHAR(250) NULL,
[RestAddr] VARCHAR(350) NULL,
[RestCity] VARCHAR(50) NULL,
[RestState] VARCHAR(2) NULL,
[RestZip] VARCHAR(5) NULL,
[CategoryID] INT NULL,
PRIMARY KEY CLUSTERED ([RestaurantID] ASC),
CONSTRAINT [FK_Restaurants_CatergoryID]
FOREIGN KEY ([CategoryID])
REFERENCES [dbo].[Categories] ([CategoryID])
);
Вот мой метод:
public void AddRestaurant(string name, string addr, string city, string state, string zip, int category)
{
DBConnect objDB = new DBConnect();
objCmd.Parameters.Clear();
objCmd.CommandType = CommandType.StoredProcedure;
objCmd.CommandText = "AddRestaurant";
objCmd.Parameters.AddWithValue("@theName", name);
objCmd.Parameters.AddWithValue("@theAddr", addr);
objCmd.Parameters.AddWithValue("@theCity", city);
objCmd.Parameters.AddWithValue("@theState", state);
objCmd.Parameters.AddWithValue("@theZip", zip);
objCmd.Parameters.AddWithValue("@theCategory", category);
objDB.GetConnection().Open();
objDB.DoUpdateUsingCmdObj(objCmd);
int affectedRows = objDB.DoUpdateUsingCmdObj(objCmd);
objDB.CloseConnection();
}
Вот событие click в файле aspx.cs:
protected void btnSubmit_Click(object sender, EventArgs e)
{
try
{
rest.RestName = txtRestName.Text;
rest.RestAddr = txtRestAddr.Text;
rest.RestCity = txtRestCity.Text;
rest.RestState = ddStates.SelectedValue;
rest.RestZip = txtRestZip.Text;
rest.CategoryID = int.Parse(ddCategories.SelectedValue);
p.AddRestaurant(txtRestName.Text, txtRestAddr.Text, txtRestCity.Text, ddStates.SelectedItem.Value, txtRestZip.Text, int.Parse(ddCategories.SelectedValue));
string error = txtRestName.Text " has been added!";
ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" error "');", true);
}
catch (SqlException ex)
{
string error = txtRestName.Text " has NOT been added!" ex;
ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" error "');", true);
}
}
Вот моя страница aspx :
<fieldset class="center, content2">
<legend>Restaurant Info</legend>
<asp:Label ID="lblRestName" runat="server" CssClass="left">Name: </asp:Label>
<asp:TextBox ID="txtRestName" runat="server" CssClass="right"></asp:TextBox>
<br /><br />
<asp:Label ID="lblRestAddr" runat="server" CssClass="left">Address: </asp:Label>
<asp:TextBox ID="txtRestAddr" runat="server" CssClass="right"></asp:TextBox>
<br /><br />
<asp:Label ID="lblRestCity" runat="server" CssClass="left">City: </asp:Label>
<asp:TextBox ID="txtRestCity" runat="server" CssClass="right"></asp:TextBox>
<br /><br />
<asp:Label ID="lblRestState" runat="server" CssClass="left">State: </asp:Label>
<asp:DropDownList ID="ddStates" runat="server" CssClass="right" Width="140px">
<asp:ListItem Value="AL">Alabama</asp:ListItem>
<asp:ListItem Value="AK">Alaska</asp:ListItem>
<asp:ListItem Value="AZ">Arizona</asp:ListItem>
<asp:ListItem Value="AR">Arkansas</asp:ListItem>
<asp:ListItem Value="CA">California</asp:ListItem>
<asp:ListItem Value="CO">Colorado</asp:ListItem>
<asp:ListItem Value="CT">Connecticut</asp:ListItem>
<asp:ListItem Value="DC">District of Columbia</asp:ListItem>
<asp:ListItem Value="DE">Delaware</asp:ListItem>
<asp:ListItem Value="FL">Florida</asp:ListItem>
<asp:ListItem Value="GA">Georgia</asp:ListItem>
<asp:ListItem Value="HI">Hawaii</asp:ListItem>
<asp:ListItem Value="ID">Idaho</asp:ListItem>
<asp:ListItem Value="IL">Illinois</asp:ListItem>
<asp:ListItem Value="IN">Indiana</asp:ListItem>
<asp:ListItem Value="IA">Iowa</asp:ListItem>
<asp:ListItem Value="KS">Kansas</asp:ListItem>
<asp:ListItem Value="KY">Kentucky</asp:ListItem>
<asp:ListItem Value="LA">Louisiana</asp:ListItem>
<asp:ListItem Value="ME">Maine</asp:ListItem>
<asp:ListItem Value="MD">Maryland</asp:ListItem>
<asp:ListItem Value="MA">Massachusetts</asp:ListItem>
<asp:ListItem Value="MI">Michigan</asp:ListItem>
<asp:ListItem Value="MN">Minnesota</asp:ListItem>
<asp:ListItem Value="MS">Mississippi</asp:ListItem>
<asp:ListItem Value="MO">Missouri</asp:ListItem>
<asp:ListItem Value="MT">Montana</asp:ListItem>
<asp:ListItem Value="NE">Nebraska</asp:ListItem>
<asp:ListItem Value="NV">Nevada</asp:ListItem>
<asp:ListItem Value="NH">New Hampshire</asp:ListItem>
<asp:ListItem Value="NJ">New Jersey</asp:ListItem>
<asp:ListItem Value="NM">New Mexico</asp:ListItem>
<asp:ListItem Value="NY">New York</asp:ListItem>
<asp:ListItem Value="NC">North Carolina</asp:ListItem>
<asp:ListItem Value="ND">North Dakota</asp:ListItem>
<asp:ListItem Value="OH">Ohio</asp:ListItem>
<asp:ListItem Value="OK">Oklahoma</asp:ListItem>
<asp:ListItem Value="OR">Oregon</asp:ListItem>
<asp:ListItem Value="PA">Pennsylvania</asp:ListItem>
<asp:ListItem Value="RI">Rhode Island</asp:ListItem>
<asp:ListItem Value="SC">South Carolina</asp:ListItem>
<asp:ListItem Value="SD">South Dakota</asp:ListItem>
<asp:ListItem Value="TN">Tennessee</asp:ListItem>
<asp:ListItem Value="TX">Texas</asp:ListItem>
<asp:ListItem Value="UT">Utah</asp:ListItem>
<asp:ListItem Value="VT">Vermont</asp:ListItem>
<asp:ListItem Value="VA">Virginia</asp:ListItem>
<asp:ListItem Value="WA">Washington</asp:ListItem>
<asp:ListItem Value="WV">West Virginia</asp:ListItem>
<asp:ListItem Value="WI">Wisconsin</asp:ListItem>
<asp:ListItem Value="WY">Wyoming</asp:ListItem>
</asp:DropDownList>
<br /><br />
<asp:Label ID="lblRestZip" runat="server" CssClass="left">Zip Code: </asp:Label>
<asp:TextBox ID="txtRestZip" runat="server" CssClass="right"></asp:TextBox>
<br /><br />
<asp:Label ID="lblCategory" runat="server" CssClass="left">Category: </asp:Label>
<asp:DropDownList ID="ddCategories" runat="server" CssClass="right" Width="140px">
<asp:ListItem Value="1">American</asp:ListItem>
<asp:ListItem Value="2">Mexican</asp:ListItem>
<asp:ListItem Value="3">Korean</asp:ListItem>
<asp:ListItem Value="4">Chinese</asp:ListItem>
<asp:ListItem Value="5">Japanese</asp:ListItem>
</asp:DropDownList>
<br /><br />
<asp:Button ID="btnSubmit" Text="Submit" runat="server" CssClass="button2" OnClick="btnSubmit_Click" />
<asp:Button ID="btnReview" Text="Add Review" runat="server" OnClick="btnReview_Click" CssClass="button2" />
</fieldset>
Комментарии:
1. Вы уверены, какую базу данных вы проверяете? Это та же база данных, которая определена в вашей строке подключения? Не могли бы вы опубликовать эту строку подключения?
2. Вы вставляете свои данные дважды.
3. Я не вижу кода, который фактически выполняет процедуру. Это похоже на какую-то оболочку. Я вижу ссылки на это в нескольких местах на веб-сайтах. Но нет способа узнать, действительно ли выполняется ваша процедура. Я предполагаю, что это не так. Возможно, вы захотите попробовать это старомодным способом, создав
SqlConnection
,SqlCommand
и выполнив его. Эта оболочка, вероятно, не добавляет ничего ценного, за исключением того, что вам сложнее определить, что происходит на самом деле.4. @Steve это довольно долго, но я уверен, что оно используется правильно. gist.github.com/76342ck/6333cc69ac82bd9c81ab4e7567c0fc05
5. Это странное явление, когда разработчики создают небольшие классы-оболочки для команд SQL. в 95% случаев это не добавляет никакого значения, и в конечном итоге вам приходится читать код оболочки, чтобы убедиться, что он выполняет то, что вы ожидаете, и в то же время так же просто использовать
System.Data.SqlClient
классы напрямую.
Ответ №1:
Я нашел свою ошибку. Я дважды открывал свое соединение.
objDB.GetConnection().Open();
Измените его на:
objDB.GetConnection();
Комментарии:
1. И вы также, похоже, выполняете свою хранимую процедуру дважды:
objDB.DoUpdateUsingCmdObj(objCmd); int affectedRows = objDB.DoUpdateUsingCmdObj(objCmd);
это может привести к вставке повторяющихся строк