Частичная замена в столбце данных изображения SQL - PullRequest
0 голосов
/ 09 июля 2011

Этот вопрос относится к другому , который я опубликовал ранее.

Напомним, мне нужно исправить проблему с древним унаследованным приложением, когда люди перепутали хранилище данных путем переустановкипрограммное обеспечение неправильно.

Приложение сохраняет данные, сохраняя записи в базе данных SQL.Каждая запись содержит ссылку на файл на диске, автоинкремент которого содержит имя файла.

При переустановке приложения автоинкремент имени файла был переустановлен, поэтому в БД теперь хранится несколько не связанных записей, которые ссылаются нато же имя файла, и я должен каталоги с файлами, которые я, очевидно, не могу объединить из-за этих идентичных имен файлов.В файлах нет ссылок на данные БД, поэтому единственное, что остается сделать, это отфильтровать записи БД по дате создания и попытаться переименовать «EXED» в «IXED» или что-то в этом роде.

БДявляется относительно простым с одной таблицей, содержащей столбец, который содержит данные типа «Изображение».

Пример содержания этих данных изображения следующий:

Данныеочевидно, Hex, который в основном кодирует бессмысленную чушь, но также содержит имя физических файлов (ближе к концу поля данных) в файловой системе, которая связана с записями SQL:

??@7???????????EXED48bb?-P??????Dyspnoe??P??????VELD RAMP 360

Меня интересуетЧасть EXED.

Нет четкой закономерности в смещении, при котором появляется имя файла и имя файла имеет переменную длину (поэтому я заранее не знаю, какой длины будет подстрока).

Я могу вызвать все записи с помощью SQL следующим образом:

    SELECT COUNT(*) as "Number of EXED Files after critical date"
    FROM [ZAN].[dbo].[zanu]
    WHERE udata is not null 
          and SUBSTRING(udata, 1 , 2147483647) like '%EXED%' 
          and [udatum] > 0 
          and CONVERT(date,[udatum]) > CONVERT(date,'20100629')

Теперь я хотел бы знать, как заменить эту подстроку EXED чем-то другим (например, IXID).

Я незнаком с SQL, и Googling пока что дал очень мало информации о моих параметрах здесь.

У меня также нет никакой другой информации об исходном коде, который сгенерировал эти данные / формат данных /кодировка / что угодно ...

Это действительно беспорядок.

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 10 июля 2011

Обновление по этому вопросу:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Threading;

namespace ZANLinq
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                DataContext zanDB = new DataContext(@"Data Source=.\,1433;database=ZAN;Integrated Security=true");


                string strSQL = @"SELECT 
                                    Idnr, 
                                    Udatum, 
                                    Uzeit, 
                                    Unr, 
                                    Uart,
                                    Ubediener, 
                                    Uzugriff, 
                                    Ugr, 
                                    Uflags, 
                                    Usize, 
                                    Udata 
                                 FROM Zanu 
                                 WHERE (Udata IS NOT null and SubString(Udata, 1 , 2147483647) LIKE '%EXED%')
                                 AND (Idnr = '           2')";

                var zanQuery = zanDB.ExecuteQuery<Zanu>(strSQL);

                List<Zanu> list = zanQuery.ToList<Zanu>();

                foreach (Zanu zanTofix in list)
                {
                    string strOriginal = ASCIIEncoding.ASCII.GetString(zanTofix.Udata);
                    string strFixed = strOriginal.Replace("EXED", "IXED");
                    zanTofix.Udata = ASCIIEncoding.ASCII.GetBytes(strFixed);
                }

                zanDB.SubmitChanges();

                //Console.WriteLine(zanResults.Count<Zanu>().ToString());

            }
            catch (SqlException e)
            {
                Console.WriteLine(e.Message);
            }

        }
    }
}

Он находит интересующие меня записи, я могу легко манипулировать данными, но фиксация не работает . Я в тупике, исключений нет, никаких указаний на то, что код неправильный.

У кого-нибудь есть идеи?

UPDATE:

Я думаю, что вышеупомянутое не работает, потому что у моей таблицы, кажется, есть составной PK (я не могу изменить это):

Columns

Так как я не мог отладить это (нигде нет информации, никаких исключений, просто тихая ошибка submitchanges ()), я решил использовать другой подход и вообще отказаться от Linq2SQL:

try
            {
                SqlConnection thisConnection = new SqlConnection(@"Network Library=DBMSSOCN;Data Source=.\,1433;database=ZAN;Integrated Security=SSPI");

                DataSet zanDataSet = new DataSet();
                SqlDataAdapter zanDa;
                SqlCommandBuilder zanCmdBuilder;

                thisConnection.Open();      

                //Initialize the SqlDataAdapter object by specifying a Select command 
                //that retrieves data from the sample table.
                zanDa = new SqlDataAdapter(@"SELECT 
                                              Idnr, 
                                              Udatum, 
                                              Uzeit, 
                                              Unr, 
                                              Uart,
                                              Ubediener, 
                                              Uzugriff, 
                                              Ugr, 
                                              Uflags, 
                                              Usize, 
                                              Udata 
                                           FROM Zanu 
                                           WHERE (Udata IS NOT null and SubString(Udata, 1 , 2147483647) LIKE '%IXED%')
                                           AND (Idnr = '           2')
                                           AND (Uzeit = '13:21')", thisConnection);

                //Initialize the SqlCommandBuilder object to automatically generate and initialize
                //the UpdateCommand, InsertCommand, and DeleteCommand properties of the SqlDataAdapter.
                zanCmdBuilder = new SqlCommandBuilder(zanDa);

                //Populate the DataSet by running the Fill method of the SqlDataAdapter.
                zanDa.Fill(zanDataSet, "Zanu");

                Console.WriteLine("Records that will be affected: " + zanDataSet.Tables["Zanu"].Rows.Count.ToString());

                foreach (DataRow record in zanDataSet.Tables["Zanu"].Rows)
                {
                    string strOriginal = ASCIIEncoding.ASCII.GetString((byte[])record["Udata"]);
                    string strFixed = strOriginal.Replace("IXED", "EXED");
                    record["Udata"] = ASCIIEncoding.ASCII.GetBytes(strFixed);

                    //string strPostMod = ASCIIEncoding.ASCII.GetString((byte[])record["Udata"]);  
                }

                zanDa.Update(zanDataSet, "Zanu"); 

                thisConnection.Close();

                Console.ReadLine();

            }
            catch (SqlException e)
            {
                Console.WriteLine(e.Message);
            }

Кажется, это работает, но любой вклад в то, почему Linq не работает и является ли мое второе решение эффективным / оптимальным или нет, по-прежнему очень ценится.

...