Как исправить предупреждение о настройке локали из Perl?

Так как не упоминается какая база данных вы подразумеваете, я предполагаю 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;
    }

Счастливое кодирование: -)

543
задан Rishabh 15 November 2016 в 08:58
поделиться

2 ответа

Ваша ОС не знает о 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
$ 

Для постоянного исправления выберите одно из

  1. В более старых host установите переменную среды LANG в файле инициализации вашей оболочки.
  2. Измените среду на стороне клиента, например. , а не ssh hunter2 , используйте команду LANG = C ssh hunter2 .
  3. Если у вас есть права администратора, запретите ssh отправлять переменные среды, закомментировав строку SendEnv LANG LC _ * в локальном файле / etc / ssh / ssh_config . (Спасибо за этот ответ . См. Ошибка 1285 для OpenSSH).
420
ответ дан 22 November 2019 в 22:13
поделиться

Обычно это означает, что вы неправильно настроили локали на своем Linux.

В Debian или Ubuntu это означает, что вам необходимо выполнить

$ sudo locale-gen
$ sudo dpkg-reconfigure locales

См. Также man locale-gen .

138
ответ дан 22 November 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: