Asp.net форму в C# вставить таблицу SQL личности как ФК
Я работаю над ASP.NET веб-сайт на языке C#. Идея состоит в том, чтобы вставить данные в базу данных SQL Server через веб-сайт.
У меня есть хранимая процедура для извлечения идентификатора и записи его в другую таблицу в качестве внешнего ключа. Моя проблема заключается в том, как написать код веб-формы на C# & ASP.NET, потому что во всем, что я написал, Есть некоторые ошибки.
Это процедура, и она прекрасно работает.
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[TEST] // Table1 @col1 NVARCHAR(MAX) ,@col2 NVARCHAR(MAX) ,@col3 NVARCHAR(MAX) ,@col4 NVARCHAR(MAX) //Table 2 @FileName VARCHAR(50) ,@FilePath VARCHAR(200) AS BEGIN SET NOCOUNT ON; DECLARE @Table_Var TABLE (ID1 INT) INSERT INTO Table1 ( col1,col2,col3,col4 ) OUTPUT inserted.ID1 INTO @Table_Var(ID1) SELECT @col1,@col2,@col3,@col4 INSERT INTO Table2 ( colID,FileName,FilePath ) SELECT ID1,@FileName,@FilePath FROM @Table_Var END
ID1-это идентификатор в Таблице 1 и внешний ключ в таблице 2 в столбце col.
У кого-нибудь есть идея? Спасибо!
Что я уже пробовал:
Идея состоит в том, чтобы иметь несколько столбцов для подробной информации о продуктах (Таблица 1), а в другой таблице я буду хранить фотографии продуктов (Таблица 2).
Это код, который не работает:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data.SqlClient; using System.Data; using System.IO; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnInsert_Click(object sender, EventArgs e) { string query = "TEST"; int ID; string connect = @"Server=.\SQLExpress;Database=database;Trusted_Connection=Yes;"; using (SqlConnection conn = new SqlConnection(connect)) { using (SqlCommand cmd = new SqlCommand(query, conn)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@col1", col1.Text); cmd.Parameters.AddWithValue("@col2", col2.Text); cmd.Parameters.AddWithValue("@col3", col3.Text); cmd.Parameters.AddWithValue("@col4", col4.Text); cmd.Parameters.Add("@ID1", SqlDbType.Int, 0, "ID1"); cmd.Parameters["@ID1"].Direction = ParameterDirection.Output; conn.Open(); cmd.ExecuteNonQuery(); ID = (int)cmd.Parameters["@ID1"].Value; } conn.Close(); conn.Dispose(); } } protected void btnUploadImage_Click(object sender, EventArgs e) { if (FileUploadImage.PostedFile != null) { string FileName = Path.GetFileName(FileUploadImage.PostedFile.FileName); FileUploadImage.SaveAs(Server.MapPath("image/" + FileName)); String strConnString = System.Configuration.ConfigurationManager.ConnectionStrings["databaseConnectionString"].ConnectionString; SqlConnection con = new SqlConnection(strConnString); string strQuery = "insert into Table2(colID, FileName, FilePath)" + " values(@ID, @FileName, @FilePath)"; SqlCommand cmd = new SqlCommand(strQuery); cmd.Parameters.Add("@ID"); cmd.Parameters.AddWithValue("@FileName", FileName); cmd.Parameters.AddWithValue("@FilePath", "image/" + FileName); cmd.CommandType = CommandType.Text; cmd.Connection = con; try { con.Open(); cmd.ExecuteNonQuery(); } catch (Exception ex) { Response.Write(ex.Message); } finally { con.Close(); con.Dispose(); } } } }
Karthik_Mahalingam
уменьшенный код?
Bryian Tan
а ошибки есть???
Richard Deeming
Ваш код C# пытается получить значение выходного параметра, называемого @ID1
. Но хранимая процедура, которую вы опубликовали, не содержит параметра, называемого @ID1
, выход или иначе.
Ваша хранимая процедура ожидает параметров @FileName
и @FilePath
Но ваш код C# не передает ни один из этих параметров.
Нажмите кнопку "улучшить вопрос" и обновите свой вопрос с фактическим кодом, который вы используете, и полной информацией об ошибках, которые вы получаете.
ZurdoDev
Я не совсем уверен, о чем вы спрашиваете, но когда мне нужно вставить в 2 таблицы, я делаю что-то простое, как это:
Вставить в таблица1 (поле1)
Значения (@field1)
Объявить @newID INT
-- Получить новое удостоверение личности
Выберите @newID = SCOPE_IDENTITY()
Вставить в таблицу 2(foreign_id, field2)
Значения (@newID, @field2)
Помогает ли это?
marieee
В первой части хранимой процедуры в качестве вывода имеется ID1.
Richard Deeming
Не в той хранимой процедуре,которую вы разместили.
Единственное упоминание о ID1
является столбцом локальной табличной переменной. Существует параметр, называемый @ID1
.
Если ваша реальная хранимая процедура содержит выходной параметр, называемый @ID1
, затем обновите свой вопрос, чтобы показать его.
А если нет, значит, вы нашли свою проблему.
marieee
"Ваша хранимая процедура ожидает параметры @FileName и @FilePath. Но ваш код C# не передает ни один из этих параметров."
Вот в чем проблема. Как передать их с полями из первой таблицы, когда мне нужно вставить значения в первую таблицу, чтобы получить идентификатор, потому что тогда я использую этот идентификатор для второй таблицы? Я не могу вставить значения для обеих таблиц одновременно. Или я могу?
Richard Deeming
Если вы вызываете хранимую процедуру, вы должны передать значения для всех параметров, которые не имеют значения по умолчанию.
Ваша хранимая процедура была разработана для вставки записи и загрузки изображения одним ударом. Если вы хотите выполнить эти две операции отдельно, то вам нужно использовать две хранимые процедуры или два запроса. Вам нужно будет сохранить идентификатор, возвращенный из первого запроса, в ViewState, чтобы вы могли использовать его при загрузке изображения.
marieee
Это моя настоящая процедура, и я не совсем понимаю, что вы имеете в виду. ID1 выводится в первой таблице, а значение-во второй. Что значит-проблема?
Karthik_Mahalingam
@FileName VARCHAR(50)
,@FilePath VARCHAR(200)
вышеприведенные параметры отсутствуют в коде. и более того id param нет
Richard Deeming
Тогда вы нашли свою проблему - ваш код C# пытается вызвать процедуру без передачи значения для двух обязательных параметров и пытается прочитать значение параметра, который НЕ СУЩЕСТВУЕТ.
Объявление столбца в локальной табличной переменной внутри процедуры не создает волшебным образом выходной параметр для процедуры.
Вам необходимо ознакомиться с документацией по выходным параметрам:
Возврат данных с помощью выходных параметров[^]
marieee
Они находятся во второй части кода, где я пытаюсь загрузить изображения. Моя проблема заключается в том, как объединить эти две части кода или передать идентификатор из первой части во вторую.
marieee
Хранимая процедура функциональна в базе данных и эти две части кода также, но во второй части кода я не могу использовать идентификатор из первой таблицы, и ошибка заключается в следующем: использование строки в качестве значения, пропущенные значения для полей, слишком много полей в хранимой процедуре.
Karthik_Mahalingam
сделайте загрузку и вставку одним нажатием кнопки, это решит проблему
marieee
Как?
marieee
Вы думаете, что решение состоит в том, чтобы создать 2 процедуры для двух таблиц и вернуть данные, которые будут храниться где-то с помощью вывода?
marieee
Мой sp отлично работает в базе данных, когда я его выполняю, и он похож на ваш, но проблема в коде и в том, как его там написать.
ZurdoDev
Очень просто.
Используйте sqlconnection.
Используйте команду sqlCommand для выполнения хранимой процедуры.
Karthik_Mahalingam
лучший вопрос
Richard Deeming
Если вы вставляете в две таблицы два отдельных шага, то у вас нет выбора - вы должен сделайте это с помощью двух запросов / хранимых процедур.
Если вы хотите вставить в обе таблицы с помощью одной процедуры, то вы должны предоставить все значения для обеих вставок за один раз.
Karthik_Mahalingam
проверьте решение.
marieee
У вас есть время посмотреть мой код?
ZurdoDev
Я не совсем понимаю, в чем твоя проблема. В чем именно заключается проблема?
marieee
Если я использую эту процедуру и код, который я написал, ошибка-это пропущенные значения для полей, и я не могу использовать идентификатор из первой таблицы во второй в качестве внешнего ключа.
marieee
Сейчас я попробую.
ZurdoDev
1. Нужно увидеть точное сообщение об ошибке и в какой строке кода это происходит.
2. Ваш c# не имеет ничего общего с внешним ключом. Все это обрабатывается в хранимой процедуре, как я описал в своем первом комментарии.
Karthik_Mahalingam
ладно. дайте мне знать, если у вас возникнут какие-либо проблемы
marieee
Ошибка такова: не удалось найти часть пути.
Karthik_Mahalingam
какая линия
marieee
FileUploadImage.SaveAs (Сервер.MapPath ("image/" + FileName));
marieee
Если я запускаю свой код, ошибка такова: процедура или функция 'TEST' ожидает параметр '@FileName', который не был указан.
Karthik_Mahalingam
убедитесь, что папка существует?
попробуйте ниже
var a = сервер.MapPath ("~/image/ " + FileName);
держите точку останова и проверьте значение и откройте значение в windows
marieee
Я пробовал это без точки останова, он пишет идентификационный номер там, где я хочу, но это проводной номер - 1009. Кроме того, в папке нет изображения
ZurdoDev
Если вы прочитаете ошибку, она должна быть довольно ясной. Ваша процедура с именем TEST ожидает, что ей будет передан параметр с именем FileName, но вы этого не сделали.
Karthik_Mahalingam
затем создайте папку изображений
marieee
Есть папка изображений, но без этого изображения, которое я пытался вставить.
Karthik_Mahalingam
почему?
marieee
Я не знаю. Я попытался создать новую папку, но ничего не изменилось. Когда я использую brakepoint на var a = Server.MapPath ("~/image/ " + FileName); у меня есть FileName, но a равно null
Karthik_Mahalingam
попробовать это
var a = сервер.MapPath ("изображение");
marieee
Я написал FileUploadImage.SaveAs (Сервер.MapPath ("image/" + FileName)); опять же, и это работает. Есть ли какое-нибудь логическое объяснение, почему мой идентификационный номер так высок? Это должно быть 20, но это 1009.
Karthik_Mahalingam
это первичный ключ и автогенерированный идентификатор?
Karthik_Mahalingam
проверьте это, и вы узнаете, почему это будет 1000
Автоматическое увеличение первичного ключа на 1000 вместо 1[^]
marieee
Да, это первичный ключ и автогенерированный идентификатор. Спасибо за всю вашу помощь, я разберусь с автоматическим увеличением на 1000.
Karthik_Mahalingam
крутой
marieee
Спасибо.
marieee
Спасибо за помощь.
marieee
Было бы совершенно неправильно, если бы я вставил еще одну таблицу в эту процедуру и код?
y
Karthik_Mahalingam
нет
marieee
Он работает нормально, но когда я вставляю данные в веб-форму и нажимаю на кнопку, чтобы вставить их в БД, данные не удаляются из полей. Есть идеи, почему?
Karthik_Mahalingam
вам придется очистить его вручную или перезагрузить страницу.
marieee
Теперь я хочу добавить один список, который будет отображать данные из третьей таблицы и вставлять в четвертую (одно поле будет ID из основной таблицы, а второе-ID из третьей таблицы). Я могу сделать это с помощью источника данных или хранимой процедуры. Предполагается, что это множественный выбор, и проблема заключается в том, как вставить все в такой код. Какой-нибудь намек?