连接到 SQL 时,变量似乎无法在 c# 上接收值

Posted

技术标签:

【中文标题】连接到 SQL 时,变量似乎无法在 c# 上接收值【英文标题】:Variable can't seem to recieve an value on c# when connecting to SQL 【发布时间】:2021-12-21 15:32:56 【问题描述】:

我正在编写一个算法来交付明天,它需要将 C# 与 SQL 数据库集成以进行测试。

我设法进行了集成,它顺利地连接到数据库,但是当我向数据库添加一个值时,它给出了一个异常错误,表明其中一个变量给出了一个空值。通过进一步调查,我意识到其中一个变量没有收到应有的值,所以它给出了这个异常错误,我该如何解决?

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using mysql.Data.MySqlClient;
using System.Windows.Forms;

// add data function classes
using System.Data;

namespace LoginSystem

    public class DBConnect
    
        string ConectionString = "";  // save connection string
        public MySqlConnection connection = null;
        public string server = "127.0.0.1:3306";// MySQL host / ip of the computer
        public string user = "root";// MySQL user
        public string password = "@Gilberto099";// MySQL password 
        DataSet ds;
        DataTable dt;
        public string Table = "teste1"; // initialize db table
        public string ConnectionType = "";
        string RecordSource = "";

        DataGridView tempdata;

        public DBConnect()
        

        

        // function to connect to the database
        public void Connect(string database_name)
        
            try
            

                ConectionString = "SERVER=" + server + ";" + "DATABASE=" + database_name + ";" + "UID=" + user + ";" + "PASSWORD=" + password + ";";

                connection = new MySqlConnection(ConectionString);
            
            catch (Exception E)
            
                MessageBox.Show(E.Message);
            
        

        // Function to execute select statements
        public void ExecuteSql(string Sql_command)
        

            nowquiee(Sql_command);

        

        // creates connection to MySQL before execution
        public void nowquiee(string sql_comm)
        
            try
            
                MySqlConnection cs = new MySqlConnection(ConectionString);
                cs.Open();
                MySqlCommand myc = new MySqlCommand(sql_comm, cs);
                myc.ExecuteNonQuery();
                cs.Close();


            
            catch (Exception err)
            

                MessageBox.Show(err.Message);
            
        

        // function to execute delete , insert and update
        public void Execute(string Sql_command)
        
            RecordSource = Sql_command;
            Table = ConnectionType;
            dt = new DataTable(ConnectionType);
            try
            
                string command = RecordSource.ToUpper();

                //======================if sql contains select==========================================
                MySqlDataAdapter da2 = new MySqlDataAdapter(RecordSource, connection);

                DataSet tempds = new DataSet();
                da2.Fill(tempds, ConnectionType);
                da2.Fill(tempds);

                //======================================================================================


            
            catch (Exception err)  MessageBox.Show(err.Message); 
        

        // function to bring selected results based on column name and row index
        public string Results(int ROW, string COLUMN_NAME)
        
            try
            
                return dt.Rows[ROW][COLUMN_NAME].ToString();
            
            catch (Exception err)
            
                MessageBox.Show(err.Message);
                return "";

            
        

        // function to bring selected results based on column index and row index
        public string Results(int ROW, int COLUMN_NAME)
        
            try
            
                return dt.Rows[ROW][COLUMN_NAME].ToString();
            
            catch (Exception err)
            
                MessageBox.Show(err.Message);
                return dt.Rows[ROW][COLUMN_NAME].ToString();

            
        
        public string ResultsColumn(string COLUMN_NAME)
        
            try
            
                return dt.Columns[COLUMN_NAME].ToString();
            
            catch (Exception err)
            
                MessageBox.Show(err.Message);
                return "";

            
        
        public string ResultsColumni(int COLUMN_NAME)
        
            try
            
                return dt.Columns[COLUMN_NAME].ToString();
            
            catch (Exception err)
            
                MessageBox.Show(err.Message);
                return dt.Columns[COLUMN_NAME].ToString();

            
        

        // Execute select statement
        public void ExecuteSelect(string Sql_command)
        
            RecordSource = Sql_command;
            ConnectionType = Table;

            dt = new DataTable(ConnectionType);
            try
            
                string command = RecordSource.ToUpper();
                MySqlDataAdapter da = new MySqlDataAdapter(RecordSource, connection);
                ds = new DataSet();
                da.Fill(ds, ConnectionType);
                da.Fill(dt);
                tempdata = new DataGridView();
            
            catch (Exception err)
            
                MessageBox.Show(err.Message);
            


        

        // count Number of rows after select
        public int Count()
        
            return dt.Rows.Count;
        
    

【问题讨论】:

这段代码到处都是。// function to execute delete , insert and update 然后使用 dataadapter.Fill - 这是一个选择。请..看看dapper-tutorial.net;它会让你的生活更轻松,你可以把这一切都扔掉 我没有时间学习另一个 NuGet - 老实说,你这么说,但是当你真正看到 Dapper 为你做了什么时,你会希望你会意识到你没有'实际上没有时间不学习它 - 没有什么可学习的,它极大地减轻了你当前数据访问的麻木乏味 当我向数据库添加值时 - 我困惑的根源是这些代码似乎都没有向数据库添加任何内容;似乎没有 INSERT 查询,也没有调用数据适配器。更新。我看到 nowquiee 看起来它能够执行插入,并且它由 Execute_Sql 调用,但似乎没有任何东西可以通过插入调用它们中的任何一个.. 我在这段代码中看到的许多问题中:一个您没有处理的缓存连接,并且您调用了两次Fill。 SQL 字符串上的ToUpper 非常糟糕。我想说这段代码通常太复杂了,帮助函数实际上并没有做太多。 我尝试了 dapper,现在他拒绝连接到我的数据库,它给出“无法访问数据库,登录失败 'MicrosoftAccount/(帐户)” 【参考方案1】:

不应该是字符串数据类型吗? (int COLUMN_NAME)

// function to bring selected results based on column index and row index
    public string Results(int ROW, int COLUMN_NAME)
    
        try
        
            return dt.Rows[ROW][COLUMN_NAME].ToString();
        
        catch (Exception err)
        
            MessageBox.Show(err.Message);
            return dt.Rows[ROW][COLUMN_NAME].ToString();

        
    

【讨论】:

问题是我想检查一个特定的列,但是想检查每一行,而不是一个特定的行,这部分会找到特定的行和一个特定的列 您能否添加断点并检查错误并附上图片。如果可能的话。这样我们就知道哪个方法失败了。 是ResultColumn方法失败了,他收到了一个表值(字符串中的一个名字)但是Connection String没有收到任何东西,但是正如Connection方法中所说,它应该 嗨,你可以这样做。 for (int i = 0; i 如果与输入参数列匹配则返回myColumn。

以上是关于连接到 SQL 时,变量似乎无法在 c# 上接收值的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin/WinForms 客户端在双线程架构中发送/接收时无法连接到套接字

无法将 C# 应用程序连接到 MSSQL

c#,socket无法接收分片的UDP数据包

连接到 IRC 服务器的问题

似乎无法将 JDBC sql 服务器驱动程序连接到 java eclipse 项目

C#定时器接收定时发送和处理接收socket异步通信,接收值放在静态变量里,有时候收到的数据不完整。