需要帮助连接字符串

PDS8475

活跃的成员
加入
2019年6月25日
消息
41
编程经验
Beginner
你好
我有一个用于从文件读取它的路径的访问数据库的连接字符串。
连接字符串和SQL查询的代码是

C#:
            string ConString = System.IO.File.ReadAllText("FixIT.con");
            ConString = ConString.Replace(System.Environment.NewLine, string.Empty);
            string FullString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ConString;
            System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();
            conn.ConnectionString = FullString;
            OleDbCommand cmd = new OleDbCommand("INSERT into Donations (Name, Address, Phone, Email, DateDonated, Type, Make, Model, Notes, EnteredBy) Values(@n, @a, @p. @em, @d, @i,            @IT, @m, @MO, @s, @NO)");
            
        
             try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Failed to connect to data source");
            }
            finally
            {
                conn.Close();
            }

我可以看到连接字符串"FullString" is
"Provider = Microsoft.ace.oledb.12.0;数据源= C:\\ Users \\ Paul \\ Documents \\ Fixit.mdb"

但是,我只需通过连接到数据源即可开始消息框。同样检查数据库文件显示没有输入记录。

我无法弄清楚为什么这不会连接。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,700
地点
悉尼,澳大利亚
编程经验
10+
当然是你得到的信息。这是您告诉它显示的消息。您应该实际检查例外,看看它的问题是什么。

The issue is fairly obvious though. You have 11 parameter placeholders in your SQL code but you don;t add any parameters to the command. Where's the data supposed to be coming from? That means that the issue actually has nothing at all to do with the connection string and it's the ExecuteNonQuery that's failing rather than the Open. That's why you need to actually look at the information the debugger provides you with.
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
这是我看到的是错误的,你可以改进。
  1. 你怎么知道这反映了一条路径;您要读取的文件,文本文件的位置在哪里,以及您为什么不使用常规实践路径建设? string ConString = System.IO.File.ReadAllText("FixIT.con");
  2. 为什么你没有将连接字符串的内容置于引号中,并达到相等的约束?
  3. 为什么要从文件读取连接字符串?
  4. 如果出现子项2,则不需要使用string.replace
  5. 这真的很糟糕的是,像这样串行字符串,你应该使用string.concat而不是这个 string FullString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ConString;
  6. 同样,请参阅Bullet 2,并在一个字符串中具有整个连接字符串。
  7. 在命令语句之后,您不会传递在连接字符串中 OleDbCommand cmd = new OleDbCommand("INSERT into Donations (Name, Address, Phone, Email, DateDonated, Type, Make, Model, Notes, EnteredBy) Values(@n, @a, @p. @em, @d, @i, @IT, @m, @MO, @s, @NO)");
  8. 在Bullet 7上,您还可以在10个值中传递10个值,并提供11个参数,包括拼写错误 @p.
  9. 此外,在Bullet 7上,您不指定参数占位符的侧面的任何参数值。 (@p,value)
  10. 如果有没有必要打开连接 或许 一个已经开放。你应该先检查一下。
  11. 您缺乏使用块将在这里更充足,尤其是在您的命令。使用块是自我处理的,您可能会在签名中找到一个链接。
  12. catch (Exception ex) 如果在异常框中输出自定义消息,您如何知道实际抛出的异常?例外EX涵盖了异常的BOAD谱。您将更好地具有多个Catch {}块的显式异常,以捕获您代码可能投掷的不同异常的范围。然后,您可以将其例外添加为最后的例外,如果没有抛出所有其他异常,则会被捕获。

以下是例子12,只是一个例子。捕获异常不用于捕获和忽略错误,它们是为了捕获错误和故障,并为您提供纠正错误或相应处理的机会。
C#:
            catch (OleDbException dbex)
            {

            }
            catch (OverflowException ofe)
            {

            }
            catch (Exception ex) /* if the above exceptions aren't thrown, the below one will catch all others. Each exception of which ever exceptions you want to catch should be handled separately and not all in one base exception block like below */
            {
                MessageBox.Show("Failed to connect to data source");
            }

希望这些建议有所帮助。你可能想读到这一点 例外.Message属性(系统) 和这个 异常类(系统)
 

PDS8475

活跃的成员
加入
2019年6月25日
消息
41
编程经验
Beginner
谢谢我重写了代码,还重写了消息框以给出异常


C#:
private void Save_button_Click(object sender, EventArgs e)
        {
          

            string ConString = System.IO.File.ReadAllText("FixIT.con");
            ConString = ConString.Replace(System.Environment.NewLine, string.Empty);
            System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();
            conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;" + @"Data Source=" + ConString;
          
            
            try
            {
                string n = Name_textBox.Text;
                string a = Address_textBox.Text;
                string p = Phone_textBox.Text;
                string em = Email_textBox.Text;
                string d = Date_textBox.Text;
                string i = EnteredBy_textBox.Text;
                string IT = Type_cmbBx.Text;
                string m = Make_textBox.Text;
                string MO = Model_textBox.Text;
                string s = Serial_textBox.Text;
                string NO = Notes_textBox.Text;

                conn.Open();
                String my_querry = "INSERT INTO Donations (Name, Address, Phone, Email, DateDonated, Type, Make, Model, Serial, Notes, EnteredBy) Values(@n, @a, @p, @em, @d, @IT, @m, @MO, @s, @NO, @i)";
                OleDbCommand cmd = new OleDbCommand(my_querry, conn);
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Failed due to " + ex.Message);
            }
            finally
            {
                conn.Close();
            }
        }

现在它似乎是连接的,如果我在Line OledbCommand Cmd = New OledbCommand(my_querry,conn)上的断点;
它指出Conn在Visual Studio的Autos部分中打开
但它正在抛出异常

由于一个或多个所需参数没有值,因此失败

我看过我的查询,并且存在与值相同的字段。所有字段都在数据库中命名为相同,并以相同的顺序。数据库中的字段也设置为不需要。

我不知道是什么导致这个错误
 

PDS8475

活跃的成员
加入
2019年6月25日
消息
41
编程经验
Beginner
这是我看到的是错误的,你可以改进。
  1. 你怎么知道这反映了一条路径;您要读取的文件,文本文件的位置在哪里,以及您为什么不使用常规实践路径建设? string ConString = System.IO.File.ReadAllText("FixIT.con");
  2. 为什么你没有将连接字符串的内容置于引号中,并达到相等的约束?
  3. 为什么要从文件读取连接字符串?
  4. 如果出现子项2,则不需要使用string.replace
  5. 这真的很糟糕的是,像这样串行字符串,你应该使用string.concat而不是这个 string FullString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ConString;
  6. 同样,请参阅Bullet 2,并在一个字符串中具有整个连接字符串。
  7. 在命令语句之后,您不会传递在连接字符串中 OleDbCommand cmd = new OleDbCommand("INSERT into Donations (Name, Address, Phone, Email, DateDonated, Type, Make, Model, Notes, EnteredBy) Values(@n, @a, @p. @em, @d, @i, @IT, @m, @MO, @s, @NO)");
  8. 在Bullet 7上,您还可以在10个值中传递10个值,并提供11个参数,包括拼写错误 @p.
  9. 此外,在Bullet 7上,您不指定参数占位符的侧面的任何参数值。 (@p,value)
  10. 如果有没有必要打开连接 或许 一个已经开放。你应该先检查一下。
  11. 您缺乏使用块将在这里更充足,尤其是在您的命令。使用块是自我处理的,您可能会在签名中找到一个链接。
  12. catch (Exception ex) 如果在异常框中输出自定义消息,您如何知道实际抛出的异常?例外EX涵盖了异常的BOAD谱。您将更好地具有多个Catch {}块的显式异常,以捕获您代码可能投掷的不同异常的范围。然后,您可以将其例外添加为最后的例外,如果没有抛出所有其他异常,则会被捕获。

以下是例子12,只是一个例子。捕获异常不用于捕获和忽略错误,它们是为了捕获错误和故障,并为您提供纠正错误或相应处理的机会。
C#:
            catch (OleDbException dbex)
            {

            }
            catch (OverflowException ofe)
            {

            }
            catch (Exception ex) /* if the above exceptions aren't thrown, the below one will catch all others. Each exception of which ever exceptions you want to catch should be handled separately and not all in one base exception block like below */
            {
                MessageBox.Show("Failed to connect to data source");
            }

希望这些建议有所帮助。你可能想读到这一点 例外.Message属性(系统) 和这个 异常类(系统)

嗨,回答问题3
数据库文件不会位于PC上该程序。因此,我在另一个表单上创建了一个按钮,如果某些人登录,则打开一个打开文件对话框,以便管理员可以选择数据库的路径,然后将路径存储在文件fixt.con中
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
你的错误是因为这个::
此外,在Bullet 7上,您不指定参数占位符的侧面的任何参数值。 (@p,value)
如果我不清楚,请参阅此示例。看看第四次闪烁在这个链接上,你知道如何使用参数:: 表单连接到SQL Server

注意:该示例适用于MySQL,但使用参数或多或少相同。
 

PDS8475

活跃的成员
加入
2019年6月25日
消息
41
编程经验
Beginner
你的错误是因为这个::

如果我不清楚,请参阅此示例。看看第四次闪烁在这个链接上,你知道如何使用参数:: 表单连接到SQL Server

注意:该示例适用于MySQL,但使用参数或多或少相同。

你必须原谅我,我有一个中风,因此在尝试专注一段时间后,我的头脑会变得非常模糊。当我的脑袋更清晰时,我明天会有一席之地。
谢谢您的帮助
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
在这一行之前:: cmd.ExecuteNonQuery();
您需要添加参数::
C#:
                        cmd.Parameters.AddWithValue("@n", Your string here);
                        cmd.Parameters.AddWithValue("@a", Your string here);
                        cmd.Parameters.AddWithValue("@p", Your string here);
                        cmd.Parameters.AddWithValue("@em", Your string here);

等等......在您的命令查询中添加您参数占位符的其余部分,因为我在上面完成,然后再次尝试执行。您显然需要在这里使用要插入假定的UI的值替换您的字符串
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,700
地点
悉尼,澳大利亚
编程经验
10+
C#:
conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;" + @"Data Source=" + ConString;
逐字字符串文字的点,即用'@'符号的字符串文字前缀,是允许您在不逃脱它们的情况下包括反斜杠。您的文字中没有反斜杠 - 您的文件路径包含在变量中 - 因此逐字字符串文字是无意义的。除非你需要逃脱别的东西,否则它不会受到伤害,但它赢了;此外,从来没有理由串联两个文字。
 
Last edited:

PDS8475

活跃的成员
加入
2019年6月25日
消息
41
编程经验
Beginner
Before this line :: cmd.ExecuteNonQuery();
您需要添加参数::
C#:
                        cmd.Parameters.AddWithValue("@n", Your string here);
                        cmd.Parameters.AddWithValue("@a", Your string here);
                        cmd.Parameters.AddWithValue("@p", Your string here);
                        cmd.Parameters.AddWithValue("@em", Your string here);

等等......在您的命令查询中添加您参数占位符的其余部分,因为我在上面完成,然后再次尝试执行。您显然需要在这里使用要插入假定的UI的值替换您的字符串
谢谢你现在完美地工作。愚蠢的是,昨晚我的大脑没有看到线条。我今天早上打开了一个例子网站,我昨晚使用了,在代码的示例中,行就在那里。
 

PDS8475

活跃的成员
加入
2019年6月25日
消息
41
编程经验
Beginner
逐字字符串文字的点,即用'@'符号的字符串文字前缀,是允许您在不逃脱它们的情况下包括反斜杠。您的文字中没有反斜杠 - 您的文件路径包含在变量中 - 因此逐字字符串文字是无意义的。除非你需要逃脱别的东西,否则它不会受到伤害,但它赢了;此外,从来没有理由串联两个文字。

谢谢我现在已经从连接字符串中删除了@符号。我想知道他们的意思,而是包括它们,因为我已经从事了他们的例子。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,700
地点
悉尼,澳大利亚
编程经验
10+
谢谢我现在已经从连接字符串中删除了@符号。我想知道他们的意思,而是包括它们,因为我已经从事了他们的例子。
示例将使用它们,因为它们包括连接字符串中的文字文件路径,斜杠必须否则必须逃脱。文件和文件夹路径是逐字字符串文字最常用的用途。
 
最佳 底部