marieee Ответов: 1

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 из третьей таблицы). Я могу сделать это с помощью источника данных или хранимой процедуры. Предполагается, что это множественный выбор, и проблема заключается в том, как вставить все в такой код. Какой-нибудь намек?

1 Ответов

Рейтинг:
9

Karthik_Mahalingam

основываясь на комментариях..

protected void btnInsert_Click(object sender, EventArgs e)
       {
           string spName = "TEST"; int ID;
           string conString = @"Server=.\SQLExpress;Database=database;Trusted_Connection=Yes;";
           if (FileUploadImage.PostedFile != null)
           {
               string FileName = Path.GetFileName(FileUploadImage.PostedFile.FileName);
               FileUploadImage.SaveAs(Server.MapPath("image/" + FileName));

               using (SqlConnection conn = new SqlConnection(conString))
               {
                   using (SqlCommand cmd = new SqlCommand(spName, 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.AddWithValue("@FileName", FileName);
                       cmd.Parameters.AddWithValue("@FilePath", "image/" + FileName);
                       cmd.CommandType = CommandType.StoredProcedure;
                       cmd.ExecuteNonQuery();

                   }
                   conn.Close();
                   conn.Dispose();
               }
           }

       }