【发布时间】:2012-01-15 17:31:16
【问题描述】:
在我目前编写的应用程序中,我经常处理几个 MySql 数据库。我知道我这样做是错误的,所以你不需要告诉我,但是我该如何以正确的方式做到这一点?例如,从 .Net 应用程序处理 MySql 数据库的正确做法是什么。
此刻我正在使用一个类,如下所示:
using System;
using MySql.Data.MySqlClient;
namespace WhateverProjectImWorkingOn
{
class MySql
{
public string myConnectionString = String.Format("SERVER={0}; DATABASE={1}; UID={2}; PASSWORD={3}", "8.8.8.8", "foobar", "foo", "barr");
public string Select(string mySqlQuery)
{
MySqlConnection connection = new MySqlConnection(myConnectionString);
MySqlCommand command = connection.CreateCommand();
MySqlDataReader Reader;
command.CommandText = mySqlQuery;
connection.Open();
Reader = command.ExecuteReader();
string thisrow = "";
while (Reader.Read())
{
for (int i = 0; i < Reader.FieldCount; i++)
{
thisrow += Reader.GetValue(i).ToString();
}
}
Reader.Close();
connection.Close();
return thisrow;
}
public void Update(string mySqlQuery)
{
MySqlConnection mangoConnection = new MySqlConnection(myConnectionString);
MySqlCommand command = mangoConnection.CreateCommand();
command.CommandText = mySqlQuery;
mangoConnection.Open();
MySqlDataReader reader = command.ExecuteReader();
mangoConnection.Close();
}
}
}
我实例化这个类,然后使用 Select 方法来选择数据,如下所示:
MySql mySql = new MySql();
string whateverIWant = mySql.Select("Select `MyValue` From `FooBarr` Where `Foo` = 'Barr'");
我像这样运行更新查询:
mySql.Update("UPDATE `tblFooBarr` SET `acme`='Foo' WHERE `tnt`='barr';");
在你开始之前,是的,我为自己草率的代码感到非常羞愧,但如果你能帮助我改进,我将不胜感激!
谢谢
【问题讨论】:
-
您应该将 MySqlConnection 类包装在 using 语句中,以确保即使出现错误也关闭连接。
-
这似乎可行,那我代码中的原始 SQL 呢?我的理解是,这只是一个巨大的 nono,就像硬编码连接参数一样。
-
您还应该使用类型安全的 MySqlParameter 来保护您的代码免受 SQL 注入。 SQL注入见以下链接msdn.microsoft.com/en-us/library/ff648339.aspx。
-
你可以使用 NHibernate - 例如见How to configure fluent nHibernate with MySQL。