Ре: PDO / MySQLi / MySQLND
, который Вы не можете только сказать, "не использует MySQLi", поскольку у них есть различные цели. PDO почти похож на уровень абстракции (хотя это не на самом деле), и разработан, чтобы облегчить использовать несколько продуктов базы данных, тогда как MySQLi характерен для соединений MySQL. Неправильно сказать, что PDO является современным слоем доступа в контексте сравнения его к MySQLi, потому что Ваш оператор подразумевает, что прогрессия была mysql-> mysqli-> PDO, который не имеет место.
выбор между MySQLi и PDO прост - если необходимо поддерживать несколько продуктов базы данных тогда, Вы используете PDO. Если Вы просто используете MySQL тогда, можно выбрать между PDO и MySQLi.
Итак, почему Вы выбрали бы MySQLi over PDO? Посмотрите ниже...
Вы корректны о MySQLnd, который является новейшей библиотекой уровня базового языка MySQL, однако это не замена для MySQLi. MySQLi (как с PDO) остается способом, которым Вы взаимодействовали бы с MySQL через свой код PHP. Оба из них используют libmysql в качестве клиента C позади кода PHP. Проблема состоит в том, что libmysql за пределами базового механизма PHP, и это - то, где mysqlnd входит, т.е. это - Собственный Драйвер, который использует базовые внутренности PHP для увеличения эффективности, конкретно где использование памяти затронуто.
MySQLnd разрабатывается MySQL самостоятельно и недавно приземлился на ответвление PHP 5.3, которое находится в тестировании RC, готовом к выпуску позже в этом году. Вы тогда будете в состоянии использовать MySQLnd с MySQLi..., но не с PDO. Это даст MySQLi повышение производительности во многих областях (не все) и сделает его лучшим выбором для взаимодействия MySQL, если Вам не будет нужна абстракция как возможности PDO.
Однако MySQLnd теперь доступен в PHP 5.3 для PDO и таким образом, можно получить преимущества улучшений производительности от ND в PDO, однако, PDO является все еще универсальным слоем базы данных и так будет вряд ли, чтобы быть в состоянии извлечь выгоду так из улучшений в ND, как MySQLi может .
Некоторые полезные сравнительные тесты могут быть найдены здесь , хотя они с 2006. Также необходимо знать о вещах как эта опция .
, Там много соображений, которые должны быть приняты во внимание при решении между MySQLi и PDO. Это действительность, это не будет иметь значение, пока Вы не добираетесь до смехотворно высоких чисел запроса и в этом случае, имеет больше смысла использовать расширение, которое было специально предназначено для MySQL, а не того, какие вещи кратких обзоров и, оказывается, обеспечивает драйверу MySQL.
Это не простой вопрос, из которого является лучшим, потому что у каждого есть преимущества и недостатки. Необходимо прочитать ссылки, которые я предоставил и придумал собственное решение, затем тестирую его и узнаю. Я использовал PDO в прошлых проектах, и это - хорошее расширение, но моим выбором для чистой производительности был бы MySQLi с новой скомпилированной опцией MySQLND (когда PHP 5.3 выпущен).
Проведено ли какое-то исследование, и ответ - использовать schema.ini, но генерировать его на лету для вашего набора данных.
http://msdn.microsoft.com/en-us/library/ ms709353 (VS.85) .aspx
содержит необходимую информацию. для построения схемы:
public static void ConstructSchema(FileInfo theFile)
{
StringBuilder schema = new StringBuilder();
DataTable data = LoadCSV(theFile);
schema.AppendLine("[" + theFile.Name + "]");
schema.AppendLine("ColNameHeader=True");
for (int i = 0; i < data.Columns.Count; i++)
{
schema.AppendLine("col" + (i + 1).ToString() + "=" + data.Columns[i].ColumnName + " Text");
}
string schemaFileName = theFile.DirectoryName + @"\Schema.ini";
TextWriter tw = new StreamWriter(schemaFileName);
tw.WriteLine(schema.ToString());
tw.Close();
}
для загрузки csv как datatable
public static DataTable LoadCSV(FileInfo theFile)
{
string sqlString = "Select * FROM [" + theFile.Name + "];";
string conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ theFile.DirectoryName + ";" + "Extended Properties='text;HDR=YES;'";
DataTable theCSV = new DataTable();
using (OleDbConnection conn = new OleDbConnection(conStr))
{
using (OleDbCommand comm = new OleDbCommand(sqlString, conn))
{
using (OleDbDataAdapter adapter = new OleDbDataAdapter(comm))
{
adapter.Fill(theCSV);
}
}
}
return theCSV;
}
для преобразования в xml
public static XElement GetXMLFromCSV(FileInfo theFile, string rootNodeName, string itemName)
{
XElement retVal;
DataTable data;
data = CrateCsvAndSchema(theFile);
DataSet ds = new DataSet(rootNodeName);
data.TableName = itemName;
ds.Tables.Add(data);
retVal = XElement.Parse(ds.GetXml());
return retVal;
}
Для чтения CSV в DataTable я рекомендую этот парсер CSV .
Это действительно легко использовать. Вот как вы можете использовать его для заполнения DataTable данными из разделенных запятыми, цитируя CSV: