Так как не упоминается какая база данных вы подразумеваете, я предполагаю SQL Server. Ниже решения работает как в 2005, так и в 2008 году.
Вы должны создать таблицу с VARBINARY(MAX)
в качестве одного из столбцов. В моем примере я создал таблицу Raporty
со столбцом RaportPlik
, являющимся столбцом VARBINARY(MAX)
.
Метод поместить file
в базу данных из drive
:
public static void databaseFilePut(string varFilePath) {
byte[] file;
using (var stream = new FileStream(varFilePath, FileMode.Open, FileAccess.Read)) {
using (var reader = new BinaryReader(stream)) {
file = reader.ReadBytes((int) stream.Length);
}
}
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
using (var sqlWrite = new SqlCommand("INSERT INTO Raporty (RaportPlik) Values(@File)", varConnection)) {
sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;
sqlWrite.ExecuteNonQuery();
}
}
Этот метод должен получить file
из базы данных и сохранить его на drive
:
public static void databaseFileRead(string varID, string varPathToNewLocation) {
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
using (var sqlQuery = new SqlCommand(@"SELECT [RaportPlik] FROM [dbo].[Raporty] WHERE [RaportID] = @varID", varConnection)) {
sqlQuery.Parameters.AddWithValue("@varID", varID);
using (var sqlQueryResult = sqlQuery.ExecuteReader())
if (sqlQueryResult != null) {
sqlQueryResult.Read();
var blob = new Byte[(sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue))];
sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length);
using (var fs = new FileStream(varPathToNewLocation, FileMode.Create, FileAccess.Write))
fs.Write(blob, 0, blob.Length);
}
}
}
Этот метод должен получить file
из базы данных и поместить его как MemoryStream
:
public static MemoryStream databaseFileRead(string varID) {
MemoryStream memoryStream = new MemoryStream();
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
using (var sqlQuery = new SqlCommand(@"SELECT [RaportPlik] FROM [dbo].[Raporty] WHERE [RaportID] = @varID", varConnection)) {
sqlQuery.Parameters.AddWithValue("@varID", varID);
using (var sqlQueryResult = sqlQuery.ExecuteReader())
if (sqlQueryResult != null) {
sqlQueryResult.Read();
var blob = new Byte[(sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue))];
sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length);
//using (var fs = new MemoryStream(memoryStream, FileMode.Create, FileAccess.Write)) {
memoryStream.Write(blob, 0, blob.Length);
//}
}
}
return memoryStream;
}
Этот метод заключается в том, чтобы поместить MemoryStream
в базу данных:
public static int databaseFilePut(MemoryStream fileToPut) {
int varID = 0;
byte[] file = fileToPut.ToArray();
const string preparedCommand = @"
INSERT INTO [dbo].[Raporty]
([RaportPlik])
VALUES
(@File)
SELECT [RaportID] FROM [dbo].[Raporty]
WHERE [RaportID] = SCOPE_IDENTITY()
";
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
using (var sqlWrite = new SqlCommand(preparedCommand, varConnection)) {
sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;
using (var sqlWriteQuery = sqlWrite.ExecuteReader())
while (sqlWriteQuery != null && sqlWriteQuery.Read()) {
varID = sqlWriteQuery["RaportID"] is int ? (int) sqlWriteQuery["RaportID"] : 0;
}
}
return varID;
}
Счастливое кодирование: -)
Ваша ОС не знает о en_US.UTF-8
.
Вы не упомянули конкретную платформу, но я могу воспроизвести вашу проблему:
% uname -a OSF1 hunter2 V5.1 2650 alpha % perl -e exit perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LC_ALL = (unset), LANG = "en_US.UTF-8" are supported and installed on your system. perl: warning: Falling back to the standard locale ("C").
Я предполагаю, что вы использовали ssh для подключения к этому старому хосту с нового настольного компьютера. Обычно / etc / ssh / sshd_config
содержит
AcceptEnv LANG LC_*
, который позволяет клиентам распространять значения этих переменных среды в новые сеансы.
Предупреждение дает вам подсказку о том, как подавить его, если вам не требуется полная локаль:
% env LANG=C perl -e exit %
или с помощью bash:
$ LANG=C perl -e exit $
Для постоянного исправления выберите одно из
LANG
в файле инициализации вашей оболочки. ssh hunter2
, используйте команду LANG = C ssh hunter2
. SendEnv LANG LC _ *
в локальном файле / etc / ssh / ssh_config
. (Спасибо за этот ответ . См. Ошибка 1285 для OpenSSH). Обычно это означает, что вы неправильно настроили локали на своем Linux.
В Debian или Ubuntu это означает, что вам необходимо выполнить
$ sudo locale-gen $ sudo dpkg-reconfigure locales
См. Также man locale-gen .