Простое решение mysqli:
blockquote>$db = new mysqli('localhost','user','password','database'); $resource = $db->query('SELECT * FROM table WHERE 1'); while ( $rows = $resource->fetch_assoc() ) { print_r($rows);//echo "{$row['field']}"; } $resource->free(); $db->close();
С обработкой ошибок: если есть фатальная ошибка, скрипт завершится с сообщением об ошибке.
blockquote>// ini_set('display_errors',1); // Uncomment to show errors to the end user. if ( $db->connect_errno ) die("Database Connection Failed: ".$db->connect_error); $db = new mysqli('localhost','user','password','database'); $resource = $db->query('SELECT field FROM table WHERE 1'); if ( !$resource ) die('Database Error: '.$db->error); while ( $row = $resource->fetch_assoc() ) { echo "{$row['field']}"; } $resource->free(); $db->close();
Использование итераторов: добавлена поддержка PHP 5.4
blockquote>$db = new mysqli('localhost','user','password','database'); foreach ( $db->query('SELECT * FROM table') as $row ) { print_r($row);//echo "{$row['field']}"; } $db->close();
Извлечение одной записи: этот код не требует
blockquote>$db = new mysqli('localhost','user','password','database'); $resource = $db->query('SELECT field FROM table'); $row = $resource->fetch_assoc(); echo "{$row['field']}"; $resource->free(); $db->close();
Хорошо, я просто сделал это на скорую руку реальное быстрый, и не сделал всей необходимой обработки ошибок и пустой проверки, но она должна дать Вам общее представление и должна быть достаточно для запущения Вас:
public static class DataTableExtensions
{
public static DataView ApplySort(this DataTable table, Comparison<DataRow> comparison)
{
DataTable clone = table.Clone();
List<DataRow> rows = new List<DataRow>();
foreach (DataRow row in table.Rows)
{
rows.Add(row);
}
rows.Sort(comparison);
foreach (DataRow row in rows)
{
clone.Rows.Add(row.ItemArray);
}
return clone.DefaultView;
}
}
Использование:
DataTable table = new DataTable();
table.Columns.Add("IntValue", typeof(int));
table.Columns.Add("StringValue");
table.Rows.Add(11, "Eleven");
table.Rows.Add(14, "Fourteen");
table.Rows.Add(10, "Ten");
table.Rows.Add(12, "Twelve");
table.Rows.Add(13, "Thirteen");
//Вид StringValue:
DataView sorted = table.ApplySort((r, r2) =>
{
return ((string)r["StringValue"]).CompareTo(((string)r2["StringValue"]));
});
Результат:
11 Одиннадцать
14 Четырнадцать
10 Десять
13 Тринадцать
12 Двенадцать
//Вид IntValue:
DataView sorted = table.ApplySort((r, r2) =>
{
return ((int)r["IntValue"]).CompareTo(((int)r2["IntValue"]));
});
Результат:
10 Десять
11 Одиннадцать
13 Тринадцать
12 Двенадцать
14 Четырнадцать
РЕДАКТИРОВАНИЕ: Измененный это на дополнительный метод.
Теперь в Вашей Лямбде, (или можно создать полноценный Метод сравнения) можно сделать любой вид пользовательской логики сортировки, в которой Вы нуждаетесь. Помните,-1 меньше, чем, 0 равно, и 1 больше, чем.
Вы могли использовать если или оператор переключения для получения схожей функциональности к избранному оператору выбора:
if (Something == "1")
MyView.Sort = "Field1 ASC";
else
MyView.Sort = "Field2 ASC";
ИЛИ
switch (MyProperty)
{
case 1:
MyView.Sort = "Field1 ASC";
break;
case 2:
MyView.Sort = "Field2 ASC";
break;
default:
MyView.Sort = "Field3 ASC";
break;
}
Я не думаю так. Вы могли однако изменить Вас SQL для возврата столбца "CustomSort", который является результатом оператора выбора:
select
(case when f = 'a' then 0 else 1 end) as CustomSort
from MyTable
Мне нравится ответ BFREE, хотя я волновался бы о риске, что мой код закончит тем, что обновил клонированную таблицу, а не реальную. (Я не продумал его достаточно, чтобы знать, является ли это на самом деле проблемой, если Вы только используете дополнительный метод в DataView
.)
можно сделать это на оригинале DataTable
путем добавления расчетного DataColumn
к нему (использование Expression
свойство) и затем сортировка на ее значении.
В Вашем случае это было бы что-то как:
DataColumn c = myTable.Columns.Add("Sort", typeof(int));
c.Expression = "iif(field='SomeValue', 0, iif(field='AnotherValue', 1, 2))";
, который виды SomeValue
первый, 116-секундный, и все остальное после этого.