В процедуре или функции SP_InsertBookDetail указано слишком много аргументов - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь сохранить данные сетки данных в таблицу базы данных.

SP_InsertBookHeader работает нормально, но при выполнении SP_InsertBookDetail появляется ошибка:

Процедура илив функции SP_InsertBookDetail указано слишком много аргументов

Я проверил процедуру и код C #;оба параметра одинаковы.

Book.cs:

private void addRecord()
{
        try
        {
            string btnClick = CusMsgBox.showBox("SAVE", "Do you want to save record?");

            if (btnClick == "1")
            {
                var bookInfo = new BookInformation();

                bookInfo.BookID = txtBookID.Text;
                bookInfo.Copies = int.Parse(txtCopies.Text);
                bookInfo.Date = DateTime.Parse(dtpDate.Value.ToString());

                var bookList = new List<BookInformation>();

                foreach (DataGridViewRow items in dgvBook.Rows)
                {
                    var bookDetailInfo = new BookInformation();

                    bookDetailInfo.BookID = txtBookID.Text;
                    bookDetailInfo.ISBN = items.Cells["ISBN"].Value.ToString();
                    bookDetailInfo.Name = items.Cells["Name"].Value.ToString();
                    bookDetailInfo.Description = items.Cells["Description"].Value.ToString();
                    bookDetailInfo.PublishDate = DateTime.Parse(items.Cells["Publish Date"].Value.ToString());
                    bookDetailInfo.Language = items.Cells["Language"].Value.ToString();
                    bookDetailInfo.AuthorID = items.Cells["Author"].Value.ToString();
                    bookDetailInfo.Category = items.Cells["Category"].Value.ToString();
                    bookDetailInfo.Edition = int.Parse(items.Cells["Edition"].Value.ToString());
                    bookDetailInfo.Price = decimal.Parse(items.Cells["Price"].Value.ToString());

                    bookList.Add(bookDetailInfo);
                }

                var bookService = new BookService();

                int line = bookService.insertBook(bookInfo, bookList);

                if (line > 0)
                {
                    clearRecord();
                    clearBookRecord();
                    viewBookID();
                    viewBookRecord();
                    CusNotifi.showSuccess("Data Inserted Succesfully!");
                }
                else
                {
                    CusNotifi.showError("Data Insert Failed!");
                }
            }
            else
            {
                CusMsgBox cmb = new CusMsgBox();
                cmb.Dispose();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
}

BookService.cs:

public int insertBook(BookInformation bookInfo, List<BookInformation> bookList)
{
    var bookData = new BookData();
    return bookData.addRecord(bookInfo, bookList);
}

BookData.cs

public int addRecord(BookInformation bookInfo, List<BookInformation> bookList)
{
    try
    {
        cmd = new SqlCommand("SP_InsertBookHeader", dbcon.ActiveCon());
        sda = new SqlDataAdapter(cmd);

        sda.SelectCommand.CommandType = CommandType.StoredProcedure;  
        sda.SelectCommand.Parameters.Add("@BookID", SqlDbType.VarChar).Value = bookInfo.BookID;
        sda.SelectCommand.Parameters.Add("@Copies", SqlDbType.Int).Value = bookInfo.Copies;
        sda.SelectCommand.Parameters.Add("@Date", SqlDbType.DateTime).Value = bookInfo.Date;

        var cmdDetail = new SqlCommand("SP_InsertBookDetail", dbcon.ActiveCon());
        var sdaDetail = new SqlDataAdapter(cmdDetail);
        sdaDetail.SelectCommand.CommandType = CommandType.StoredProcedure;

        foreach (BookInformation items in bookList)
        {                       
            sdaDetail.SelectCommand.Parameters.Add("@BookID", SqlDbType.VarChar).Value = items.BookID;
            sdaDetail.SelectCommand.Parameters.Add("@ISBN", SqlDbType.VarChar).Value = items.ISBN;
            sdaDetail.SelectCommand.Parameters.Add("@Name", SqlDbType.VarChar).Value = items.Name;
            sdaDetail.SelectCommand.Parameters.Add("@Description", SqlDbType.VarChar).Value = items.Description;
            sdaDetail.SelectCommand.Parameters.Add("@PublishDate", SqlDbType.DateTime).Value = items.PublishDate;
            sdaDetail.SelectCommand.Parameters.Add("@Language", SqlDbType.VarChar).Value = items.Language;
            sdaDetail.SelectCommand.Parameters.Add("@AuthorID", SqlDbType.VarChar).Value = items.AuthorID;
            sdaDetail.SelectCommand.Parameters.Add("@Category", SqlDbType.VarChar).Value = items.Category;
            sdaDetail.SelectCommand.Parameters.Add("@Edition", SqlDbType.Int).Value = items.Edition;
            sdaDetail.SelectCommand.Parameters.Add("@Price", SqlDbType.Decimal).Value = items.Price;
        }

        int line = cmd.ExecuteNonQuery();
        int line1 = cmdDetail.ExecuteNonQuery();

        return line;
    }
    catch
    {
        throw;
    }
    finally
    {
        cmd.Dispose();
        dbcon.CloseCon();
    }
}

Процедура:

ALTER PROCEDURE [dbo].[SP_InsertBookDetail]
    @BookID VARCHAR(20),
    @ISBN VARCHAR(50),
    @Name VARCHAR(100),
    @Description VARCHAR(10),
    @PublishDate DATETIME,
    @Language VARCHAR(20),
    @AuthorID VARCHAR(20),
    @Category VARCHAR(20),
    @Edition INT,
    @Price DECIMAL(18, 2)
AS
BEGIN
    INSERT INTO Book_Detail(BookID, ISBN, Name, Description, PublishDate, Language, AuthorID, Category, Edition, Price) 
    VALUES (@BookID, @ISBN, @Name, @Description, @PublishDate, @Language, @AuthorID, @Category, @Edition, @Price)
END

Ответы [ 3 ]

2 голосов
/ 16 октября 2019

Не совсем уверен, что вы пытаетесь сделать здесь, но в вашем коде есть несколько вещей, которые немного левее центра.

Пара вещей, которые вы не хотите делать.

  1. использовать соединение, открытое откуда-то еще.
  2. Оставьте параметры varchar длиной по умолчанию

Я бы перестроил этот метод на что-то большее по этимлинии.

public int addRecord(BookInformation bookInfo, List<BookInformation> bookList)
        {
            try
            {
                using (SqlConnection conn = new SqlConnection("Your Connection String Here"))
                {
                    conn.Open();
                    using (SqlCommand cmd = new SqlCommand("SP_InsertBookHeader", conn))
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.Add("@BookID", SqlDbType.VarChar).Value = bookInfo.BookID;
                        cmd.Parameters.Add("@Copies", SqlDbType.Int).Value = bookInfo.Copies;
                        cmd.Parameters.Add("@Date", SqlDbType.DateTime).Value = bookInfo.Date;
                        cmd.ExecuteNonQuery();
                    }

                    using (SqlCommand cmdLine = new SqlCommand("SP_InsertBookDetail", conn))
                    {
                        cmdLine.CommandType = CommandType.StoredProcedure;
                        foreach (BookInformation items in bookList)
                        {
                            cmdLine.Parameters.Clear();
                            cmdLine.Parameters.Add("@BookID", SqlDbType.VarChar, 20).Value = items.BookID;
                            cmdLine.Parameters.Add("@ISBN", SqlDbType.VarChar, 50).Value = items.ISBN;
                            cmdLine.Parameters.Add("@Name", SqlDbType.VarChar, 100).Value = items.Name;
                            cmdLine.Parameters.Add("@Description", SqlDbType.VarChar, 10).Value = items.Description;
                            cmdLine.Parameters.Add("@PublishDate", SqlDbType.DateTime).Value = items.PublishDate;
                            cmdLine.Parameters.Add("@Language", SqlDbType.VarChar, 20).Value = items.Language;
                            cmdLine.Parameters.Add("@AuthorID", SqlDbType.VarChar, 20).Value = items.AuthorID;
                            cmdLine.Parameters.Add("@Category", SqlDbType.VarChar, 20).Value = items.Category;
                            cmdLine.Parameters.Add("@Edition", SqlDbType.Int).Value = items.Edition;
                            cmdLine.Parameters.Add("@Price", SqlDbType.Decimal, 18).Value = items.Price;
                            cmdLine.ExecuteNonQuery();
                        }
                    }
                    return bookList.Count; //not really sure what you want to return here
                }
            }
            catch (Exception ex)
            {
                //Do something with your exceptions here.
                //Log them in the database or an exception log
                //report this back to the calling application or the user
            }
        }
1 голос
/ 16 октября 2019

Кто-то, пожалуйста, поправьте меня / это неправильно. C # далек от моего состояния, и я почти полностью основываю этот ответ на документе и на этом ответе .

private void addRecord()
    {
        try
        {
            string btnClick = CusMsgBox.showBox("SAVE", "Do you want to save record?");

            if (btnClick == "1")
            {

                Using (SqlConnection conn = new SqlConnection(connectionString)) //No idea where your connection string is
                {
                    Using (SqlCommand cmd = new SqlCommand("SP_InsertBookHeader", conn))
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.Add("@BookID", SqlDbType.VarChar).Value = txtBookID.Text;
                        cmd.Parameters.Add("@Copies", SqlDbType.Int).Value = int.Parse(txtCopies.Text);
                        cmd.Parameters.Add("@Date", SqlDbType.DateTime).Value = DateTime.Parse(dtpDate.Value.ToString());

                        conn.Open();
                        int line = cmd.ExecuteNonQuery();
                    }
                }
                foreach (DataGridViewRow items in dgvBook.Rows)
                {
                    Using (SqlConnection conn = new SqlConnection(connectionString))    
                    {

                        Using (SqlCommand cmd = new SqlCommand("SP_InsertBookDetail", conn))
                        {
                            cmd.CommandType = CommandType.StoredProcedure;
                            cmd.Parameters.Add("@BookID", SqlDbType.VarChar).Value = txtBookID.Text;
                            cmd.Parameters.Add("@ISBN", SqlDbType.VarChar).Value = items.Cells["ISBN"].Value.ToString();
                            cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = items.Cells["Name"].Value.ToString();
                            cmd.Parameters.Add("@Description", SqlDbType.VarChar).Value = items.Cells["Description"].Value.ToString();
                            cmd.Parameters.Add("@PublishDate", SqlDbType.DateTime).Value = DateTime.Parse(items.Cells["Publish Date"].Value.ToString());
                            cmd.Parameters.Add("@Language", SqlDbType.VarChar).Value =  items.Cells["Language"].Value.ToString();
                            cmd.Parameters.Add("@AuthorID", SqlDbType.VarChar).Value = items.Cells["Author"].Value.ToString();
                            cmd.Parameters.Add("@Category", SqlDbType.VarChar).Value = items.Cells["Category"].Value.ToString();
                            cmd.Parameters.Add("@Edition", SqlDbType.Int).Value = int.Parse(items.Cells["Edition"].Value.ToString());
                            cmd.Parameters.Add("@Price", SqlDbType.Decimal).Value = decimal.Parse(items.Cells["Price"].Value.ToString());

                            conn.Open();
                            cmd.ExecuteNonQuery();

                        }
                    }

                }

                if (line > 0)
                {
                    clearRecord();
                    clearBookRecord();
                    viewBookID();
                    viewBookRecord();
                    CusNotifi.showSuccess("Data Inserted Succesfully!");
                }
                else
                {
                    CusNotifi.showError("Data Insert Failed!");
                }
            }
            else
            {
                CusMsgBox cmb = new CusMsgBox();
                cmb.Dispose();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

Примечание. Я справился со всемв addRecord();Я не думал , что другой был необходим. Я полагаю , что, поскольку я использую Using блоки, параметры, соединения и т. Д. Также будут изящно удалены до выполнения следующего оператора.

Если это необходимонемного подтолкнуть в правильном направлении, кто-то намного лучше в C #, пожалуйста, отредактируйте или оставьте комментарий.

0 голосов
/ 16 октября 2019

Попробуйте поместить «AuthorID» вместо «Author» в строку:

bookDetailInfo.AuthorID = items.Cells ["Author"]. Value.ToString ();

из Book.cs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...