Хранение структуры данных C# в базу данных SQL

Я не знаю ни о каких параметрах API для перехода к двоичному файлу haxe, но предполагалось, что это будет HAXEPATH environment variable , на который вы могли бы сослаться с помощью Sys.getEnv()? [ 118]

В противном случае вы можете запустить процесс, найти путь и записать его в файл:

function getHaxeBinPath () : String {
    var path = switch ( Sys.systemName () ) {
        case "Windows":
            // Windows Script.
        case "Linux":
            Sys.command ( "echo $( which haxe ) >> exePath.txt" );
            Sys.io.File.getContent ( "exePath.txt" );
        case "BSD":
            // BSD Script.
        case "Mac":
            // Macintosh Script.
        default:
            throw "Unknown Operating System!";
    }

    if ( sys.FileSystem.exists ( "exePath.txt" ) {
        sys.FileSystem.deleteFile ( "exePath.txt" );
    }

    return path;
}

, но тогда вам потребуется сценарий для каждой операционной системы и учетная запись для версии вещей. Если вы решите пойти по этому пути, я думаю, что в Windows есть команда WHERE , которую вы могли бы использовать, но я не очень много знаю о ней.

Это не похоже на то, что оно будет работать на * nix (из-за необходимости входа / выхода для обновления переменных среды), но вы могли бы установить переменную среды в обработать, а затем получить его с Sys.getEnv()? Та же проблема с созданием пользовательских вещей для каждой ОС.

9
задан alienfluid 19 October 2008 в 23:54
поделиться

6 ответов

Во-первых, существует очевидный маршрут простого создания реляционной структуры и отображения объекта к полям в базе данных.

Во-вторых, если у Вас есть объект, который является сериализуемым, можно сохранить его в SQL-сервере. Я сделал это при случае и использовал Тип данных text в SQL Server для хранения XML.

Мнение: Я предпочитаю хранить сериализованные объекты как XML вместо двоичных данных. Почему? Поскольку можно на самом деле считать то, что там (для отладки), и в SQL Server можно использовать XQuery для выбора данных из сериализованного объекта. На основе моего опыта увеличение производительности использования двоичных данных не будет стоить того по сравнению с наличием данных, которые легче отладить и могут использоваться psuedo-реляционным способом. Смотрите на возможности SQL Server XQuery. Даже если Вы не планируете использование его сразу же, нет никакой причины поместить себя в угол.

Вы могли бы посмотреть на некоторые примеры с помощью NetDataContractSerializer.

Я верю тому, что Вы называете, вектором является Список <> в C#. Смотрите в Системе. Наборы. Универсальный. Можно использовать NetDataContractSerializer для сериализации Списка 3 строк как:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.IO;

namespace SerializeThingy
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> myList = new List<string>();
            myList.Add("One");
            myList.Add("Two");
            myList.Add("Three");
            NetDataContractSerializer serializer = new NetDataContractSerializer();
            MemoryStream stream = new MemoryStream();
            serializer.Serialize(stream, myList);
            stream.Position = 0;
            Console.WriteLine(ASCIIEncoding.ASCII.GetString(stream.ToArray()));
            List<string> myList2 = (List<string>)serializer.Deserialize(stream);
            Console.WriteLine(myList2[0]);
            Console.ReadKey();
        }
    }
}

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

Не забудьте ссылаться на Систему. Время выполнения. Сериализация для получения доступа к NetDataContractSerializer.

23
ответ дан 4 December 2019 в 06:23
поделиться
[Serializable]
public struct Vector3
{
    public double x, y, z;
}

class Program
{
    static void Main(string[] args)
    {
        Vector3 vector = new Vector3();
        vector.x = 1;
        vector.y = 2;
        vector.z = 3;

        MemoryStream memoryStream = new MemoryStream();
        BinaryFormatter binaryFormatter = new BinaryFormatter();
        binaryFormatter.Serialize(memoryStream, vector);
        string str = System.Convert.ToBase64String(memoryStream.ToArray());

        //Store str into the database
    }
}
8
ответ дан 4 December 2019 в 06:23
поделиться

Принятие объектов отмечено с [Serializable] или реализация ISerializable BinaryFormatter класс уступает простому дорогу, чтобы сделать это.

В противном случае Вы выглядите на (не тривиальными) пользовательский код.

3
ответ дан 4 December 2019 в 06:23
поделиться

Если Вы собираетесь делать это (и я предполагаю, что это технически возможно), Вы могли бы точно также использовать плоский файл: нет никакого смысла в использовании реляционной базы данных больше.

2
ответ дан 4 December 2019 в 06:23
поделиться

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

using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Data.SqlClient;
using System.Runtime.Serialization;

public byte[] SerializeList<T>(List<T> list)
{

    MemoryStream ms = new MemoryStream();

    BinaryFormatter bf = new BinaryFormatter();

    bf.Serialize(ms, list);

    ms.Position = 0;

    byte[] serializedList = new byte[ms.Length];

    ms.Read(serializedList, 0, (int)ms.Length);

    ms.Close();

    return serializedList; 

} 

public List<T> DeserializeList<T>(byte[] data)
{
    try
    {
        MemoryStream ms = new MemoryStream();

        ms.Write(data, 0, data.Length);

        ms.Position = 0;

        BinaryFormatter bf = new BinaryFormatter();

        List<T> list = bf.Deserialize(ms) as List<T>;

        return list;
    }
    catch (SerializationException ex)
    {
        // Handle deserialization problems here.
        Debug.WriteLine(ex.ToString());

        return null;
    }

}

Затем в клиентском коде:

List<string> stringList = new List<string>() { "January", "February", "March" };

byte[] data = SerializeList<string>(stringList);

Один основной способ хранить/получать этот массив байтов мог состоять в том, чтобы использовать простые объекты SQLClient:

SqlParameter param = new SqlParameter("columnName", SqlDbType.Binary, data.Length);
param.Value = data; 

etc...
2
ответ дан 4 December 2019 в 06:23
поделиться

У меня есть больше опыта с реляционными базами данных, чем c#, но двоичная сериализация является приемлемым способом пойти, поскольку это позволяет состоянию всего объекта быть сохраненным в базу данных. Сериализация XML является в значительной степени тем же, хотя универсальные типы не позволяются.

0
ответ дан 4 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

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