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();
        }
    }
}

App.config的行为与常规方式不同

整个用户实例和AttachDbFileName=方法是有缺陷的-充其量!在Visual Studio中运行应用程序时,它将围绕.mdf文件进行复制(从App_Data目录复制到应用程序运行的输出目录,通常为.'bin'debug),并且很可能,您的INSERT工作得很好,但您最终只是看到了错误的.mdf文件

如果您想坚持这种方法,请尝试在myConnection.Close()调用上设置断点,然后使用SQL Server Mgmt Studio Express检查.mdf文件,我几乎可以肯定您的数据已经存在。

在我看来,真正的解决方案是

  1. 安装SQL Server Express(而且您已经安装了)

  2. 安装SQL Server Management Studio Express

  3. SSMS Express中创建数据库,并为其指定一个逻辑名称(例如Store

  4. 使用其逻辑数据库名称(在服务器上创建时给定)连接到它,并且不要干扰物理数据库文件和用户实例。在这种情况下,您的连接字符串将类似于:

    Data Source=.''SQLEXPRESS;Database=Store;Integrated Security=True
    

    其他一切都与以前完全一样。。。

此外:您应该阅读SQL注入并将代码更改为以避免这是应用程序的头号安全风险。您应该在ADO.NET中使用参数化查询-这些查询是安全的,而且速度更快!