我正在使用Visual Studio 2012自学C#并遇到连接问题。基本上,我想使用combobox
根据用户选择连接到数据库。
例如:当用户选择TEST1
时,这将选择test1
数据库,而TEST2
将启用test2
database..etc
我拼凑在一起的代码使用一个按钮,通过messagebox
显示SQL脚本的结果。目前我不能让它工作,因为消息框不显示任何内容。
我评论了MainConnection()
,因为这是一个测试,看看连接是否正常。
感谢有人能指出我正确的方向。
请参阅下面的C#代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace TestDB
{
public partial class Form1 : Form
{
class ComboItemExample
{
public string DisplayString { get; set; }
public string ConnectionString { get; set; }
public override string ToString() { return DisplayString; }
}
private string currentConnection = "Data Source= np-2 ;Initial Catalog= TESTDB Integrated Security=true";
public Form1()
{
InitializeComponent();
var firstConnection = new ComboItemExample { DisplayString = "Data Source= np-2 ;Initial Catalog= TESTDB1 Integrated Security=true" };
comboBox1.Items.Add("TEST1");
var secondConnection = new ComboItemExample { DisplayString = "Data Source= np-2 ;Initial Catalog= TESTDB2 Integrated Security=true" };
comboBox1.Items.Add("TEST2");
}
public void MainConnection()
{
//Make connection to np-2 TESTDB
//string str = "Data Source= np-hums12 ;Initial Catalog= TESTDB;"
//+ "Integrated Security=true";
// ReadOrderData(str);
}
public static void ReadOrderData(string currentConnection)
{
// Run SQL script
string queryString = "SELECT *;";
using (SqlConnection connection = new SqlConnection(currentConnection))
{
SqlCommand command = new SqlCommand(queryString, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
}
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
// call read before accessing data.
while (reader.Read())
{
//display script in message box
MessageBox.Show(reader.GetValue(1).ToString());
}
// close when finished reading.
reader.Close();
}
}
private void CloseUI_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void ShowData_Click(object sender, EventArgs e)
{
MainConnection();
}
private void comboBox1_SelectedIndexChanged_1(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex <= 0) return;
var newConnection = ((ComboItemExample)comboBox1.Items[comboBox1.SelectedIndex]).ConnectionString;
// use "newConnection" as connection string.
currentConnection = newConnection;
using (var connection = new SqlConnection(currentConnection))
{
}
}
}
}
答案 0 :(得分:0)
假设您的连接字符串正确且正常运行,它没有显示任何内容的原因是因为它在您的SQL中引发了错误。
这一行就是你的错误所在
string queryString = "SELECT *;";
它不是有效的SQL查询,您还需要指定一个表。为了将来的帮助,通常使用try-catch语句来帮助识别潜在的错误。
例如,在您的代码中,您可以使用
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
try
{
connection.Open();
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
MessageBox.Show(reader.GetValue(1).ToString());
}
//dont need to close the reader as the using statement will dispose of it once finished anyway
}
connection.Close();
}
catch (Exception ex)
{
connection.Close();
Console.WriteLine(ex.Message);
//or, depending on the package Debug.WriteLine(ex.Message);
}
}
这将打印出异常并停止程序锁定。就目前而言,您当前的一个不会抛出错误,说没有找到任何内容,但它会在输出日志中抛出SQL异常,但不会提供详细信息。 Exeception.Message
会向您提供详细信息,或SqlException.Message
可以提供与SQL相关的消息。
编辑:回复您发布的评论(以及我之前错过的内容)
查看添加ComboBox
项目的方式,您甚至没有添加您认为自己拥有的对象。从您的代码中,您的组合框项目将是“TEST1”和“TEST2” - 而不是连接字符串。
相反,您可以将对象添加到框中,如此
comboBox1.Items.Add(new ComboItemExample() {DisplayString ="TEST1",ConnectionString = "Data Source= np-2 ;Initial Catalog= TESTDB1 Integrated Security=true"});
comboBox1.Items.Add(new ComboItemExample() {DisplayString ="TEST2",ConnectionString = "Data Source= np-2 ;Initial Catalog= TESTDB2 Integrated Security=true"});
comboBox1.DisplayMember = "DisplayString";
comboBox1.ValueMember = "ConnectionString";
然后从组合框中为您的查询检索值
string myConnectionVal = comboBox1.SelectedValue.ToString();
您收到强制转换错误的原因是您从未首先将ComboItemExample
分配给组合框。使用上面添加代码的项目,您将来可以执行此操作,但如果您只需要对象中的单个值,ValueMember
就更容易使用。
答案 1 :(得分:0)
看起来你只是将文本值添加到组合框中,但实际上并没有将连接字符串绑定到它。您可能无意中将值“TEST1”和“TEST2”作为连接字符串传递。您应该将在构造函数中创建的新变量添加为新项,而不是那些字符串。使用将Item作为参数的Add()。
mycombobox.Add(new Item("Test1", firstConnection));