Я не уверен, как исправить ошибку, связанную с открытым DataReader, если я закрою его, то он вызывает приступы. Я пытался изменить имена команд, а также другие имена, чтобы предотвратить эту проблему, но, похоже, она сохраняется. Это первая проблема, вторая проблема - я не могу вытащить правильные данные из своего списка. Когда я передаю информацию из базы данных в список, она должна находиться в столбцах FirstName в списке First Name, затем Middle Initials и так далее. Я чувствую, что это может быть проблема с командной строкой q.
Я пробовал это разными способами, но, похоже, ничего из этого не работает. Я изменил имена читателей, пытался закрывать и открывать по мере необходимости. Что касается данных извлечения, которые я попытался изменить в командной строке q, я попытался передать информацию по-другому.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using System.Data.SqlClient;
using System.Data.Sql;
using System.Windows.Forms;
namespace DEITO
{
/// <summary>
/// Interaction logic for Customers.xaml
/// </summary>
public partial class Customers : Window
{
public static List<String> CustomerFirstName = new List<string>();
List<String> CustomerMiddleInitial = new List<string>();
List<String> CustomerLastName = new List<string>();
List<String> CustomerTaxClass = new List<string>();
List<String> CustomerEmail = new List<string>();
public Customers()
{
InitializeComponent();
RetriveCustomerInfo();
}
public static string name;
private List<String> RetriveCustomerInfo()
{
DataTable dt = new DataTable();
try
{
SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\SCook\Documents\LoginInformation.mdf;Integrated Security=True;Connect Timeout=30");
con.Open();
string q = "SELECT * FROM CustomerInfo";
SqlCommand Comm = new SqlCommand(q, con);
// SqlDataAdapter DAdapter = new SqlDataAdapter();
SqlDataReader ReadThis = Comm.ExecuteReader();
int Readerint = 0;
while (ReadThis.Read())
{
// int StringCount = 0;
name = ReadThis.GetString(1);
//string MN = Reader.GetString(StringCount);
//string LN = Reader.GetString(StringCount);
//string TC = Reader.GetString(StringCount);
//string EM = Reader.GetString(StringCount);
CustomerFirstName.Add(name);
//CustomerMiddleInitial.Add(MN);
//CustomerLastName.Add(LN);
//CustomerTaxClass.Add(TC);
//CustomerEmail.Add(EM);
// cmd..Parameters.Add(new SqlParameter("@FMT", name);
Comm.ExecuteNonQuery();
Comm.Parameters.Clear();
con.Close();
Readerint = Readerint + 1;
}
}
catch(Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
/*string output = string.Join("\n", CustomerFirstName);
string Out1 = string.Join("\n", CustomerMiddleInitial);
string Out2 = string.Join("\n", CustomerLastName);
string Out3 = string.Join("\n", CustomerTaxClass);
string Out4 = string.Join("\n", CustomerEmail);
System.Windows.Forms.MessageBox.Show(output); */
return CustomerFirstName;
}
private void Exit_Clicked(object sender, RoutedEventArgs e)
{
this.Close();
}
public class CustomerInformation
{
public string FirstName { get; set; }
public string MiddleInital { get; set; }
public string LastName { get; set; }
public string TaxClass { get; set; }
public string Email { get; set; }
}
public void FillDataGridWithCustInfo()
{
int ArrayNum = 0;
Int32 length = CustomerFirstName.Count;
while (length >= ArrayNum)
{
CustomerInformation TempCust = new CustomerInformation();
TempCust.FirstName = name;
CustomerDataGrid.Items.Add(TempCust);
ArrayNum = ArrayNum + 1;
}
}
private void AddnewCustomer_Click(object sender, RoutedEventArgs e)
{
CustomerInformation TempCust = new CustomerInformation();
TempCust.FirstName = FirstNameText.Text;
TempCust.MiddleInital = MiddleInitalText.Text;
TempCust.LastName = LastNameText.Text;
TempCust.TaxClass = TaxClassText.Text;
TempCust.Email = EmailText.Text;
CustomerDataGrid.Items.Add(TempCust);
SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\SCook\Documents\LoginInformation.mdf;Integrated Security=True;Connect Timeout=30");
con.Open();
string q = "insert into CustomerInfo (FirstName, MiddleInital, LastName, TaxClass, Email) Values(@FMT, @MIT, @LNT, @TCT, @EMT)";
SqlCommand Comm = new SqlCommand(q, con);
Comm.Parameters.AddWithValue("@FMT", FirstNameText.Text);
Comm.Parameters.AddWithValue("@MIT", MiddleInitalText.Text);
Comm.Parameters.AddWithValue("@LNT", LastNameText.Text);
Comm.Parameters.AddWithValue("@TCT", TaxClassText.Text);
Comm.Parameters.AddWithValue("@EMT", EmailText.Text);
Comm.ExecuteNonQuery();
Comm.Parameters.Clear();
con.Close();
System.Windows.Forms.MessageBox.Show("You have successfully added to the database");
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//RetriveCustomerInfo();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
FillDataGridWithCustInfo();
}
}
}
Я пытаюсь взять данные из базы данных CustomerInfo и заполнить их в CustomerDataGrid. Кажется, это должно быть менее сложно, чем я это представляю, но SQL не мой любимый язык, с которым приходится иметь дело. Когда я изменяю .getstring (некоторый номер) с 0 на 1, он извлекается только из первого ряда данных. поэтому вместо того, чтобы дать мне имя следующего человека, он даст мне средний инициал.
Сообщение об исключении: с этой командой уже связан открытый считыватель данных, который должен быть закрыт первым.