在同一事件下进行多次“插入”操作

时间:2011-10-19 03:32:46

标签: c# sql ado.net insert

伙计我四处寻找地狱,但没有什么可以帮助我,所以我觉得是时候问了。在我写问题之前,我需要说我需要它的解决方案,因为这是我明天必须提出的一个项目,因为年龄太长而且仍然在浪费时间,我坚持同样的主题。

好在这里;

我需要在图书馆系统中添加一本书,在第一阶段我添加标准书籍功能,这些功能只有“一个值”(如名称,页码,发布时间,发布商ID等)但是我想要的书籍MAY有多个作家和类别杀了我,但我仍然无法解决。我试图将书添加到它的(书籍)表中,然后使用我从中获得的信息,我做了另一个插入操作。到(bookWriters)表。当我检查它时,编译器按顺序执行所有操作而没有错误,但是当我从SQL Server检查表时没有任何内容。

这是我试图做的事情;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Data.SqlClient;

namespace Project_
{
    public partial class addBook: Form
    {
        public addBook()
        {
            InitializeComponent();
        }

        public main refForm;

        int chosenWritersNumber; //how many writers have selected on listbox
        int[] writers= { }; // an array list that i keep writerIDs that comes from class
        int ind = 0;

        int insertedBookID; // to catch latest added book's ID
        int chosenWriterID; // writer that will be added

        private void bookAddingPreps()
        {
            chosenWritersNumber = lstWriters.SelectedItems.Count;

            Array.Resize<int>(ref writers, chosenWritersNumber );

            for (int i = 0; i < chosenWritersNumber ; i++)
            {
                writers[i] = ((X_Writers)lstWriters.SelectedItems[i]).XWriterID;
            }
        }

        private void addMainBookInfos()
        {
            SqlConnection con = new SqlConnection(Conn.Activated);

            SqlCommand com = new SqlCommand("AddBook", con);

            com.CommandType = CommandType.StoredProcedure;

            com.Parameters.AddWithValue("@BookISBN", txtISBN.Text);            

            con.Close();
        }

        private void catchAddedBookID()
        {
            SqlConnection con = new SqlConnection(Conn.Activated);
            SqlCommand com = new SqlCommand("catchBookID", con);

            com.CommandType = CommandType.StoredProcedure;

            con.Open();
            SqlDataReader dr = com.ExecuteReader();
            if (dr.HasRows)
            {
                while (dr.Read())
                {
                    insertedBookID = dr.GetInt32(0);
                }
            }
            dr.Close();
            con.Close();
        }

        private void addWritersOfTheBook()
        {
            chosenWriterID = writers[ind];

            SqlConnection con = new SqlConnection(Conn.Activated);

            SqlCommand com = new SqlCommand("addBookWriters", con);
            com.CommandType = CommandType.StoredProcedure;

            com.Parameters.AddWithValue("@BookID", insertedBookID);
            com.Parameters.AddWithValue("@WriterID", chosenWriterID);
            con.Close();
        }

我点击按钮调用这些方法。你也看到了存储过程名称,但是当我检查它们都是正确的时,在这个页面上一定有一个我仍然无法看到的错误但是如果需要的话我可以添加哪些程序写入但是它们都经过测试并且看起来很有效。

正如我所说,当我这样做时,作为ind = 0,应该添加一个编写器,断点显示一切正常,编译器没有显示任何错误但是当我检查sql server表时,它是空的。

使用Visual Studio 2010 Ultimate和SQL Server 2008 Dev。使用C#编写。

由于

1 个答案:

答案 0 :(得分:0)

你忘记执行你的SqlCommand了。调用command.ExecuteNonReader();执行它而不期望任何结果。见:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx

除此之外,不要忘记处理在您的方法中获得的资源。类似的东西:

private void addMainBookInfos() 
{ 
    using (SqlConnection con = new SqlConnection(Conn.Activated))
    using (SqlCommand com = new SqlCommand("AddBook", con))
    {
        com.CommandType = CommandType.StoredProcedure; 
        com.Parameters.AddWithValue("@BookISBN", txtISBN.Text);             

        com.ExecuteNonQuery()

        // close can be omitted since you are already using the 'using' statement which automatically closes the connection
        con.Close(); 
    }
}