App.config的行为与常规方式不同
本文关键字:常规 方式不 config App | 更新日期: 2023-09-27 18:21:16
我的连接字符串过去是这样的:
SqlConnection cn = new SqlConnection(@"Data Source=.'SQLEXPRESS;AttachDbFilename=G:'I.S'C#'billingSystem'Store.mdf;Integrated Security=True;User Instance=True");
所以我可以(插入,更新,删除)用这个:
SqlCommand cmd = new SqlCommand("SQLSTATEMENT", cn);
cn.Open();
cmd.ExecuteNonQuery();
cn.Close();
我在youtube上看到一个名为"部署C#项目"的教程,当时他使用
System.Configuration;
和app.config
文件,所以我以完全相同的方式遵循了教程,它也能工作。
在我(插入、更新、删除)运行时一切正常,直到我关闭应用程序,就像我什么都没做一样,我插入的所有数据都消失了!。
我需要在运行时将更改保存到表中。
一些信息:Winforms应用程序,我的代码示例:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
<add name="SchoolProjectConnectionString"
connectionString="Data Source=.'SQLEXPRESS;AttachDbFilename=|DataDirectory|'SchoolDB.mdf;Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
namespace SchoolProject
{
public partial class Main : Form
{
SqlConnection cn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["SchoolProjectConnectionString"].ToString());
public Main()
{
InitializeComponent();
}
private void button4_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void button1_Click(object sender, EventArgs e)
{
string myValue = Interaction.InputBox("Enter ID", "ID", "", 100, 100);
string myValue0 = Interaction.InputBox("Enter Name", "Name", "", 100, 100);
int X = Convert.ToInt32(myValue);
SqlCommand cmd = new SqlCommand("Insert into Student(ID, Student) Values ('" + X + "','" + myValue0 + "')", cn);
cn.Open();
cmd.ExecuteNonQuery();
cn.Close();
}
private void button2_Click(object sender, EventArgs e)
{
string myValue3 = Interaction.InputBox("Enter ID", "ID", "", 100, 100);
int X = Convert.ToInt32(myValue3);
SqlCommand cmd = new SqlCommand("SELECT * FROM Student WHERE id = '" + X + "'", cn);
cn.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
MessageBox.Show(reader["Student"].ToString());
}
}
cn.Close();
}
private void button3_Click(object sender, EventArgs e)
{
Report R = new Report();
R.Show();
}
}
}
整个用户实例和AttachDbFileName=方法是有缺陷的-充其量!在Visual Studio中运行应用程序时,它将围绕.mdf
文件进行复制(从App_Data
目录复制到应用程序运行的输出目录,通常为.'bin'debug
),并且很可能,您的INSERT
工作得很好,但您最终只是看到了错误的.mdf文件!
如果您想坚持这种方法,请尝试在myConnection.Close()
调用上设置断点,然后使用SQL Server Mgmt Studio Express检查.mdf
文件,我几乎可以肯定您的数据已经存在。
在我看来,真正的解决方案是
-
安装SQL Server Express(而且您已经安装了)
-
安装SQL Server Management Studio Express
-
在SSMS Express中创建数据库,并为其指定一个逻辑名称(例如
Store
) -
使用其逻辑数据库名称(在服务器上创建时给定)连接到它,并且不要干扰物理数据库文件和用户实例。在这种情况下,您的连接字符串将类似于:
Data Source=.''SQLEXPRESS;Database=Store;Integrated Security=True
其他一切都与以前完全一样。。。
此外:您应该阅读SQL注入并将代码更改为以避免这是应用程序的头号安全风险。您应该在ADO.NET中使用参数化查询-这些查询是安全的,而且速度更快!