C#에서 SQLLite를.. 열고 닫고.. 하면 table is locked

 

-_-...

 

처음은 잘된다.. 근데.. 두번째 부터는 저런 메세지가 뜬다..

 

하지만 당황하지 말자..

 

open->close 끝이라 생각하면 바로 걸리니..

 

connection을 dispose 걸어주고 command까지 dispose 걸어주면 바로 해결이 된다..

 

당황스런 시츄에이션.. 이건 좀 ㅠㅠ 아닌거 같아 ㅠㅠㅠ

[ETC] NSIS Comsori 2015. 10. 16. 12:50

음... 깔끔하게 포스팅을 하려고 하다가..

 

일단은.. 참고 할 수 있는 사이트 링크를.. 살포시..

 

http://blog.naver.com/ratmsma/40028387013

 

http://skql.tistory.com/505

 

위 두군데에서 보면 NSIS를 어느정도 입맛에 맞게 할 수가 있다.

 

NSIS는 무료 배포 패키지를 만드는 프로그램인데..

 

오픈소스 기반에 에디터에서 기본적인 스크립트를 생성을 해 주니 편하다.

 

거기에서 이제 등록 화면들을 자체적으로 수정해서 쓰면 되니..

 

일반적인 배포 프로그램 만드는 것보다 이게 훨씬 수월한 느낌...

오랜만이라 그런가.. 적응이 안된? 뭐.. 그런.. 잠시의 작업으로

 

내 기억이라면 또 까먹기에..

 

NetworkStream으로 주고 받을 때도 Receive 될 시 대기가 된 다는 것은.. 알고 있던건데..

 

문제는.. DeSerialize...

 

Exception이 죽어라 떠 주시길래..

 

구글신이 응답을 주셨...다..

 

샘플 코드를 보면..

 

[Server]

sealed class AllowAllAssemblyVersionsDeserializationBinder : System.Runtime.Serialization.SerializationBinder
    {
        public override Type BindToType(string assemblyName, string typeName)
        {
            Type typeToDeserialize = null;
            String currentAssembly = Assembly.GetExecutingAssembly().FullName;
            assemblyName = currentAssembly;
            typeToDeserialize = Type.GetType(string.Format("{0},{1}", typeName, assemblyName));
            return typeToDeserialize;

        }
    }

 

IPAddress address = IPAddress.Parse("192.168.1.143");
            TcpListener server = new TcpListener(address, 7771);
            server.Start();

            while(true)
            {
                Socket sock = server.AcceptSocket();
                if (sock.Connected)
                {
                    NetworkStream nStream = new NetworkStream(sock);

                    MemoryStream mStream = new MemoryStream();

                    byte[] size = new byte[4];

                    int receivedData;

                    receivedData = nStream.Read(size, 0, size.Length);
                    mStream.Write(size, 0, receivedData);

                    Console.WriteLine(BitConverter.ToInt32(size, 0));
                    mStream.Seek(0, SeekOrigin.Begin);

                    byte[] buffer = new byte[BitConverter.ToInt32(size, 0)];

                    receivedData = nStream.Read(buffer, 0, buffer.Length);
                    mStream.Write(buffer, 0, receivedData);

                    BinaryFormatter bf = new BinaryFormatter();
                    bf.Binder = new AllowAllAssemblyVersionsDeserializationBinder();
                    mStream.Seek(0, SeekOrigin.Begin);
                    testData a = bf.Deserialize(mStream) as testData;

                    Console.WriteLine(a.test);

                    mStream.Close();
                    nStream.Close();
                }
            }

 

[Client]

static void Main(string[] args)
        {
            ArrayList a = new ArrayList();
           
            testData data = new testData();
            data.test = "test";

            a.Add(data);

            MemoryStream m = serialize(data);
            m.Seek(0, SeekOrigin.Begin);

            byte[] size = new byte[4];

            byte[] buffer = m.ToArray();

            size = BitConverter.GetBytes(buffer.Length);

            TcpClient client = new TcpClient("192.168.1.143", 7771);
            NetworkStream nStream = client.GetStream();

            nStream.Write(size, 0, size.Length);
            nStream.Write(buffer, 0, buffer.Length);

            nStream.Close();
            client.Close();
        }

        private static MemoryStream serialize(testData arr)
        {
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream mStream = new MemoryStream();
           
            bf.Serialize(mStream, arr);

            return mStream;
        }

저~짝 Server에 보면 AllowAllAssemblyVersionsDeserializationBinder Class가 있다..

 

저 부분을 추가 해 주고 BinaryFormatter에 Bind 시켜주니..

 

이쁘게 잘된다..

 

그리고 다들 알다 시피 직렬화 할 때는 대상 Class 위에 [Serialize] 명시는 꼭 해주고..

 

또한.. 서로 다른 Library를 만들어 놓고 Class 내용만 같게 하는 일이 있다면.. 정말.. 혼나야겠고..

 

해 보면 죽어라 Exception이 일어나는 일을 만나게 될 것임돠.

 

테스트 해 봤더니 신날하게 나서 방법 없을라나 고민 해 봤지만 하다가 포기..

 

그냥 같은 library 쓰고 하면 되니까..

 

요새 손 안대던 부분까지 다시 하니까 기억이 가물 가물.. 나도 이제 끝인가ㅠ