简体   繁体   English

我该怎么做才能修复我的SQLIte连接字符串

[英]What can i do to fix my SQLIte connection string

I am working with SQLite for the first time and now when I want to add something to the DB, It throws an error saying: 我第一次使用SQLite,现在当我想向数据库中添加某些内容时,它抛出一条错误消息:

" Invalid ConnectionString format, cannot parse: string value to split cannot be null" “无效的ConnectionString格式,无法解析:要拆分的字符串值不能为空”

Here is my code so far for this(I am working from a tutorial): 到目前为止,这是我的代码(我正在学习教程):

String dbConnection;

    /// <summary>
    ///     Default Constructor for SQLiteDatabase Class.
    /// </summary>
    public void SQLiteDatabase()
    {
        dbConnection = "Data Source = StockDB.s3db; Version = 3;";

    }

 public int ExecuteNonQuery(string sql)
    {
        SQLiteConnection cnn = new SQLiteConnection(dbConnection);
        cnn.Open(); //error thrown here
        SQLiteCommand mycommand = new SQLiteCommand(cnn);
        mycommand.CommandText = sql;
        int rowsUpdated = mycommand.ExecuteNonQuery();
        cnn.Close();
        return rowsUpdated;
    }

I dont know if you need the code for the sql query aswell but: 我不知道您是否还需要sql查询的代码,但是:

DBHelper db = new DBHelper();
UserInfo UI = new UserInfo();
UI.UserName = "henry";
UI.Code = 123;
UI.Role = "LEADER";    
string sql = "INSERT INTO User (Username, Code, Role)" +
                    "VALUES (" + UI.UserName + "" + UI.Code.ToString() + "" + UI.Role + ")";
        db.ExecuteNonQuery(sql);

I don't know how to fix this. 我不知道该如何解决。 I can read from the database no problem. 我可以从数据库中读取没问题。

Extra Information: 额外的信息:

namespace Stock_A_Lot
{
public class DBHelper
{

    String dbConnection;
    /// <summary>
    ///     Default Constructor for SQLiteDatabase Class.
    /// </summary>
    public void SQLiteDatabase()
    {
        dbConnection = "Data Source = StockDB.s3db; Version = 3;";
    }       
    public DataTable GetDataTable(string sql)
    {
        DataTable dt = new DataTable();
        try
        {
            SQLiteConnection cnn = new SQLiteConnection(dbConnection);
            cnn.Open();
            SQLiteCommand mycommand = new SQLiteCommand(cnn);
            mycommand.CommandText = sql;
            SQLiteDataReader reader = mycommand.ExecuteReader();
            dt.Load(reader);
            reader.Close();
            cnn.Close();
        }
        catch (Exception e)
        {
            throw new Exception(e.Message);
        }
        return dt;
    }
    /// <summary>
    ///     Allows the programmer to interact with the database for purposes other than a query.
    /// </summary>
    /// <param name="sql">The SQL to be run.</param>
    /// <returns>An Integer containing the number of rows updated.</returns>
    public int ExecuteNonQuery(string sql)
    {
        SQLiteConnection cnn = new SQLiteConnection(dbConnection);
        cnn.Open();
        SQLiteCommand mycommand = new SQLiteCommand(cnn);
        mycommand.CommandText = sql;
        int rowsUpdated = mycommand.ExecuteNonQuery();
        cnn.Close();
        return rowsUpdated;
    }

    /// <summary>
    ///     Allows the programmer to retrieve single items from the DB.
    /// </summary>
    /// <param name="sql">The query to run.</param>
    /// <returns>A string.</returns>
    public string ExecuteScalar(string sql)
    {
        SQLiteConnection cnn = new SQLiteConnection(dbConnection);
        cnn.Open();
        SQLiteCommand mycommand = new SQLiteCommand(cnn);
        mycommand.CommandText = sql;
        object value = mycommand.ExecuteScalar();
        cnn.Close();
        if (value != null)
        {
            return value.ToString();
        }
        return "";
    }        

    /// <summary>
    ///     Allows the programmer to easily insert into the DB
    /// </summary>
    /// <param name="tableName">The table into which we insert the data.</param>
    /// <param name="data">A dictionary containing the column names and data for the insert.</param>
    /// <returns>A boolean true or false to signify success or failure.</returns>
    public bool Insert(String tableName, Dictionary<String, String> data)
    {
        String columns = "";
        String values = "";
        Boolean returnCode = true;
        foreach (KeyValuePair<String, String> val in data)
        {
            columns += String.Format(" {0},", val.Key.ToString());
            values += String.Format(" '{0}',", val.Value);
        }
        columns = columns.Substring(0, columns.Length - 1);
        values = values.Substring(0, values.Length - 1);
        try
        {
            this.ExecuteNonQuery(String.Format("insert into {0}({1}) values({2});", tableName, columns, values));
        }
        catch (Exception fail)
        {
            MessageBox.Show(fail.Message);
            returnCode = false;
        }
        return returnCode;
    }
}

} }

The connection string might be fine, but it's never being set. 连接字符串可能很好,但从未设置过。 Because you never call the SQLiteDatabase() function to set it. 因为您永远不会调用SQLiteDatabase()函数进行设置。

It looks like you intended for that to be a constructor , not an invokable method. 看起来您打算让它成为构造函数 ,而不是可调用的方法。 Something like this: 像这样:

public SQLiteDatabase()
{
    dbConnection = "Data Source = StockDB.s3db; Version = 3;";
}

(Note the lack of the void keyword.) (请注意缺少void关键字。)

Or perhaps this: 也许这样:

public DBHelper()
{
    dbConnection = "Data Source = StockDB.s3db; Version = 3;";
}

Depends on what the class is actually named. 取决于的实际名称。


Note: It's also worth pointing out that your code is currently open to SQL injection attacks. 注意:还值得指出的是,您的代码当前对SQL注入攻击开放。 You should take a look at parameterized queries instead of directly concatenating values like that. 您应该看一下参数化查询,而不是像这样直接串联值。 Currently you're potentially allowing users to execute arbitrary code on your database, which is a very bad thing. 当前,您潜在地允许用户在数据库上执行任意代码,这是非常不好的事情。 Query parameters treat such input as values instead of as executable code . 查询参数将此类输入视为值,而不是可执行代码

尝试这个

 dbConnection = "Data Source = StockDB.db3;";

This is what the class looks like in order to work. 这是班上班的样子。

namespace Stock_A_Lot
{
public class DBHelper
{

    String dbConnection;
    /// <summary>
    ///     Default Constructor for DBHelper Class.
    /// </summary>
    public DBHelper()
    {
        dbConnection = "Data Source = StockDB.s3db; Version = 3;";
    }

    /// 
   /* /// <summary>
    ///     Single Param Constructor for specifying the DB file.
    /// </summary>
    /// <param name="inputFile">The File containing the DB</param>
    public void SQLiteDatabase(String inputFile)
    {
        dbConnection = String.Format("Data Source={0}", inputFile);
    }

    /// <summary>
    ///     Single Param Constructor for specifying advanced connection options.
    /// </summary>
    /// <param name="connectionOpts">A dictionary containing all desired options and their values</param>
    public void SQLiteDatabase(Dictionary<String, String> connectionOpts)
    {
        String str = "";
        foreach (KeyValuePair<String, String> row in connectionOpts)
        {
            str += String.Format("{0}={1}; ", row.Key, row.Value);
        }
        str = str.Trim().Substring(0, str.Length - 1);
        dbConnection = str;
    }*/

    /// <summary>
    ///     Allows the programmer to run a query against the Database.
    /// </summary>
    /// <param name="sql">The SQL to run</param>
    /// <returns>A DataTable containing the result set.</returns>
    public DataTable GetDataTable(string sql)
    {
        DataTable dt = new DataTable();
        try
        {
            SQLiteConnection cnn = new SQLiteConnection(dbConnection);
            cnn.Open();
            SQLiteCommand mycommand = new SQLiteCommand(cnn);
            mycommand.CommandText = sql;
            SQLiteDataReader reader = mycommand.ExecuteReader();
            dt.Load(reader);
            reader.Close();
            cnn.Close();
        }
        catch (Exception e)
        {
            throw new Exception(e.Message);
        }
        return dt;
    }
    /// <summary>
    ///     Allows the programmer to interact with the database for purposes other than a query.
    /// </summary>
    /// <param name="sql">The SQL to be run.</param>
    /// <returns>An Integer containing the number of rows updated.</returns>
    public int ExecuteNonQuery(string sql)
    {
        SQLiteConnection cnn = new SQLiteConnection(dbConnection);
        cnn.Open();
        SQLiteCommand mycommand = new SQLiteCommand(cnn);
        mycommand.CommandText = sql;
        int rowsUpdated = mycommand.ExecuteNonQuery();
        cnn.Close();
        return rowsUpdated;
    }

    /// <summary>
    ///     Allows the programmer to retrieve single items from the DB.
    /// </summary>
    /// <param name="sql">The query to run.</param>
    /// <returns>A string.</returns>
    public string ExecuteScalar(string sql)
    {
        SQLiteConnection cnn = new SQLiteConnection(dbConnection);
        cnn.Open();
        SQLiteCommand mycommand = new SQLiteCommand(cnn);
        mycommand.CommandText = sql;
        object value = mycommand.ExecuteScalar();
        cnn.Close();
        if (value != null)
        {
            return value.ToString();
        }
        return "";
    }

    /// <summary>
    ///     Allows the programmer to easily update rows in the DB.
    /// </summary>
    /// <param name="tableName">The table to update.</param>
    /// <param name="data">A dictionary containing Column names and their new values.</param>
    /// <param name="where">The where clause for the update statement.</param>
    /// <returns>A boolean true or false to signify success or failure.</returns>
    public bool Update(String tableName, Dictionary<String, String> data, String where)
    {
        String vals = "";
        Boolean returnCode = true;
        if (data.Count >= 1)
        {
            foreach (KeyValuePair<String, String> val in data)
            {
                vals += String.Format(" {0} = '{1}',", val.Key.ToString(), val.Value.ToString());
            }
            vals = vals.Substring(0, vals.Length - 1);
        }
        try
        {
            this.ExecuteNonQuery(String.Format("update {0} set {1} where {2};", tableName, vals, where));
        }
        catch
        {
            returnCode = false;
        }
        return returnCode;
    }

    /// <summary>
    ///     Allows the programmer to easily delete rows from the DB.
    /// </summary>
    /// <param name="tableName">The table from which to delete.</param>
    /// <param name="where">The where clause for the delete.</param>
    /// <returns>A boolean true or false to signify success or failure.</returns>
    public bool Delete(String tableName, String where)
    {
        Boolean returnCode = true;
        try
        {
            this.ExecuteNonQuery(String.Format("delete from {0} where {1};", tableName, where));
        }
        catch (Exception fail)
        {
            MessageBox.Show(fail.Message);
            returnCode = false;
        }
        return returnCode;
    }

    /// <summary>
    ///     Allows the programmer to easily insert into the DB
    /// </summary>
    /// <param name="tableName">The table into which we insert the data.</param>
    /// <param name="data">A dictionary containing the column names and data for the insert.</param>
    /// <returns>A boolean true or false to signify success or failure.</returns>
    public bool Insert(String tableName, Dictionary<String, String> data)
    {
        String columns = "";
        String values = "";
        Boolean returnCode = true;
        foreach (KeyValuePair<String, String> val in data)
        {
            columns += String.Format(" {0},", val.Key.ToString());
            values += String.Format(" '{0}',", val.Value);
        }
        columns = columns.Substring(0, columns.Length - 1);
        values = values.Substring(0, values.Length - 1);
        try
        {
            this.ExecuteNonQuery(String.Format("insert into {0}({1}) values({2});", tableName, columns, values));
        }
        catch (Exception fail)
        {
            MessageBox.Show(fail.Message);
            returnCode = false;
        }
        return returnCode;
    }

    /// <summary>
    ///     Allows the programmer to easily delete all data from the DB.
    /// </summary>
    /// <returns>A boolean true or false to signify success or failure.</returns>
    public bool ClearDB()
    {
        DataTable tables;
        try
        {
            tables = this.GetDataTable("select NAME from SQLITE_MASTER where type='table' order by NAME;");
            foreach (DataRow table in tables.Rows)
            {
                this.ClearTable(table["NAME"].ToString());
            }
            return true;
        }
        catch
        {
            return false;
        }
    }

    /// <summary>
    ///     Allows the user to easily clear all data from a specific table.
    /// </summary>
    /// <param name="table">The name of the table to clear.</param>
    /// <returns>A boolean true or false to signify success or failure.</returns>
    public bool ClearTable(String table)
    {
        try
        {

            this.ExecuteNonQuery(String.Format("delete from {0};", table));
            return true;
        }
        catch
        {
            return false;
        }
    }

}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在运行时更改我的 SQLite 连接字符串? - How can I change my SQLite connection string at runtime? SQLite:如何将连接字符串的数据源设置为应用程序文件夹中的文件? - SQLite: How do I set up the Data Source of a connection string to be a file within my application folder? 我的项目的一部分开始使用不正确的连接字符串-如何解决该问题? - Part of my project started using incorrect connection string - how do I fix that? 如何处理连接字符串上的空格? - What to do about spaces on my connection string? 如何在C#中修复SQLite查询? - How can I fix my SQLite query in C#? 由于进行了碰撞检查,我的Unity角色偶尔掉落在地板上。 我该怎么做才能解决此问题? - Due to collision checking, my Unity character is occasionally falling through the floor. What can I do to fix this? 为什么我的C# class代码是死循环? 我能做些什么来修复它? - Why is my C# class code in an infinite loop? What can I do to fix it? 我该如何加快与SQL在线数据库的连接(“配对”速度,而不是查询速度)? - What can i do to speed up the connection (“pairing” speed, not query speed) to my SQL online database? 当我在客户端PC中安装连接字符串时,我需要在c#应用程序中编辑连接字符串吗,如果可以,我该怎么做? - do i need to edit connection string in my c# application when i install it in a client pc, if yes how can i do it? 我的连接字符串应该是什么? - What should my connection string be?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM