Update 쿼리 시 아래와 같은 에러가 발생되었다.

System.Data.SqlClient.SqlException: 'The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction.
Warning: Null value is eliminated by an aggregate or other SET operation.
The statement has been terminated.'

찾아보니 Select 시 SUM 등을 할때 null 인 항목이 있는 경우 에러가 도출된다고 하는데

SET ANSI_WARNINGS OFF

GO


위 명령을 통해 오류는 도출되지 않도록 할수 있다고한다.


하지만 내가 겪은건 희한하게 다른 컬럼을 처리하면 상관없는데

유독 한 컬럼만 문제가 있었다.

컬럼명이 예약어와 동일해서 문제가 생기는줄 알고 열심히 백틱, 더블쿼테이션, 대괄호 처리 를 했지만 오류가 계속 도출..;;


결론은 
해당 컬럼에 Trigger 가 걸려있었고 그 Trigger 에서 발생되는 에러였다.




iOS 에서 SafeArea 를 지정 하면

상단과 하단에 영역이 생기면서 그쪽에는 앱구동 화면이 표시되지 않는다

하지만 하단의 영역은 살려두고 싶을때가 있다. 

이때는 OnAppearing() 에 아래처럼 코딩하면 하단의 영역을 살려 

앱구동화면이 하단에도 문제 없이 표시된다.


protected override void OnAppearing()

{

    base.OnAppearing();

    var safeInsets = On<iOS>().SafeAreaInsets();

    safeInsets.Bottom = 0;

    Padding = safeInsets;

}



Command 에 인자로 두가지 항목을 던지고자 할때

이를 class 로 정의하여 CommandParameter 로 던질수 있다.

 

먼저 프로젝트에 Prism.Wpf Nuget Package 를 설치한다.

 

이제 Class 구조를 잡는다.

(string, object 로 구성)

[StringObject.cs]

namespace MultiValueConverterSample

{

    public class StringObject

    {

        /// <summary>

        /// 문자열 데이터입니다.

        /// </summary>

        public string StringData;

 

        /// <summary>

        /// 오브젝트 데이터입니다.

        /// </summary>

        public object ObjectData;

 

        /// <summary>

        /// 생성자입니다.

        /// </summary>

        /// <param name="stringData">문자열 데이터입니다.</param>

        /// <param name="objectData">오브젝트 데이터입니다.</param>

        public StringObject(string stringData, object objectData)

        {

            this.StringData = stringData;

            this.ObjectData = objectData;

        }

    }

}

 

 

IMultiValueConverter 를 정의한다.

(화면에서 처리된 두개의 인자를 가지고 위에서 만들 Class 구조로 변환해 리턴)

[StringObjectConverter.cs]

using System;

using System.Globalization;

using System.Windows.Data;

 

namespace MultiValueConverterSample

{

    public class StringObjectConverter : IMultiValueConverter

    {

        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)

        {

            return new StringObject(values[0].ToString(), values[1]);

        }

 

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)

        {

            throw new NotImplementedException();

        }

    }

}

 

 

화면에 아래 처럼 구성한다.

(조회 버튼을 클릭하면 StringObjectCommand 를 실행해

입력한 값을 string 으로 버튼 객체를 object 로 하여 CommandParameter 로 사용한다.)

[MainWindow.xaml]

<Window x:Class="MultiValueConverterSample.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:MultiValueConverterSample"

        mc:Ignorable="d"

        Title="MainWindow" Height="450" Width="800">

    <Window.Resources>

        <local:StringObjectConverter x:Key="StringObjectConverter" />

    </Window.Resources>

    <Grid>

        <StackPanel>

            <TextBox Name="contentTextBlock" Width="100" Height="30" Margin="10"/>

            <Button Name="searchButton" Content="조회" Margin="10" Height="30" Width="100" Command="{Binding StringObjectCommand}">

                <Button.CommandParameter>

                    <MultiBinding Converter="{StaticResource StringObjectConverter}">

                        <Binding ElementName="contentTextBlock" Path="Text" />

                        <Binding ElementName="searchButton" />

                    </MultiBinding>

                </Button.CommandParameter>

            </Button>

        </StackPanel>

    </Grid>

</Window>

 

 

코드비하인드 단에서는 아래 처럼 처리한다.

(반드시 this.DataContext = this; 을 해야 Command 가 처리된다.)

[MainWindow.xaml.cs]

using Prism.Commands;

 

using System.Windows;

using System.Windows.Input;

 

namespace MultiValueConverterSample

{

    /// <summary>

    /// MainWindow.xaml에 대한 상호 작용 논리

    /// </summary>

    public partial class MainWindow : Window

    {

        #region StringObjectCommand

 

        /// <summary>

        /// StringObjectCommand

        /// </summary>

        public ICommand StringObjectCommand

        {

            get

            {

                if (stringObjectCommand == null)

                {

                    stringObjectCommand = new DelegateCommand<StringObject>((stringObject) =>

                    {

                        string stringData = stringObject.StringData;

                        object objectData = stringObject.ObjectData;

                    });

                }

                return stringObjectCommand;

            }

        }

        private DelegateCommand<StringObject> stringObjectCommand;

 

        #endregion

 

        public MainWindow()

        {

            InitializeComponent();

 

            this.DataContext = this;

        }

    }

}

 

 

 

조회 버튼을 누르게 되면 Command 에서 아래 처럼 해당 항목이 넘어온것을 확인할 수 있다.

 

 

 


Rg.Plugins.Popup 을 이용해서 팝업을 호출한 경우 Back  버튼이나 팝업을 벗어난 화면을 터치한 경우

팝업이 닫히게 되는데 이를 막기 위해서 코드단에 아래와 같은 코드를 넣으면 된다.


CloseWhenBackgroundIsClicked = false;

ContextMenu 의 Item 을 선택한 경우 ContextMenu 가 닫히는데

만약 체크 박스가 있는 경우 이를 유지하고 싶을 때가 있다.

이때 MenuItem 의 StaysOpenOnClick 을 true 로 주게 되면 ContextMenu 가 닫히지 않고

클릭 이벤트가 수행된다.


                <ContextMenu>

                    <MenuItem Header="첫번째" IsCheckable="True" StaysOpenOnClick="True"/>

                </ContextMenu>



Shell.Current.GoToAsync("..");

페이지를 지정하지 않고 바로 이전 페이지로 가고 싶을때 사용합니다.


Android 쪽 타겟팅 Android 버전을 Android 9.0 에서 Android 10.0 으로 올렸더니 

아래와 같은 에러가 발생되었다.


Could not find 2 Android X assemblies, make sure to install the following NuGet packages:

 - Xamarin.AndroidX.MediaRouter

You can also copy-and-paste the following snippet into your .csproj file:

    <PackageReference Include="Xamarin.AndroidX.MediaRouter" Version="1.1.0.1" /> UnitConversion.Android


위에러는 Nuget 의 AndroidX 의 패키지가 더이상 지원을 안해서 발생하는 문제로

NugetPackage 에서 Xamarin.Android.Support.v7.MediaRouter 를 제거하면 해결된다.



아래 예시는 각기 다른 4가지 이미지를 4분면에 그리는 코드입니다.

 

4분면에 이미지를 하나씩 그리는 예시입니다.

처음 이미지의 크기에 따라 나머지 이미지 들도 크기가 지정되며

바둑판모양으로 이미지가 달라 붙습니다.

 

        private void MergeImage(string path1, string path2, string path3, string path4, string outputFilePath)

        {

            // 이미지를 로드합니다.

            BitmapFrame frame1 = BitmapDecoder.Create(new Uri(path1), BitmapCreateOptions.None, BitmapCacheOption.OnLoad).Frames.First();

            BitmapFrame frame2 = BitmapDecoder.Create(new Uri(path2), BitmapCreateOptions.None, BitmapCacheOption.OnLoad).Frames.First();

            BitmapFrame frame3 = BitmapDecoder.Create(new Uri(path3), BitmapCreateOptions.None, BitmapCacheOption.OnLoad).Frames.First();

            BitmapFrame frame4 = BitmapDecoder.Create(new Uri(path4), BitmapCreateOptions.None, BitmapCacheOption.OnLoad).Frames.First();

 

            // 첫번째이미지 기준으로 그려질 이미지의 크기를 정의합니다.

            int imageWidth = frame1.PixelWidth;

            int imageHeight = frame1.PixelHeight;

 

            // DrawingVisual 에 전체 4분면에서 각 분면 이미지를 그립니다.

            DrawingVisual drawingVisual = new DrawingVisual();

            using (DrawingContext drawingContext = drawingVisual.RenderOpen())

            {

                drawingContext.DrawImage(frame1, new Rect(0, 0, imageWidth, imageHeight));

                drawingContext.DrawImage(frame2, new Rect(imageWidth, 0, imageWidth, imageHeight));

                drawingContext.DrawImage(frame3, new Rect(0, imageHeight, imageWidth, imageHeight));

                drawingContext.DrawImage(frame4, new Rect(imageWidth, imageHeight, imageWidth, imageHeight));

            }

 

            // RenderTargetBitmap 을 사용해 DrawingVisual 을 BitmapSource 객체로 변환합니다.

            RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(imageWidth * 2, imageHeight * 2, 96, 96, PixelFormats.Pbgra32);

            renderTargetBitmap.Render(drawingVisual);

 

            // BitmapSource 를 PngBitmapEncoder 를 사용해 frame 에 추가합니다.

            PngBitmapEncoder encoder = new PngBitmapEncoder();

            encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));

 

            // 이미지를 저장합니다.

            using (Stream stream = File.Create(outputFilePath))

            {

                encoder.Save(stream);

            }

        }

 

* ico 파일 지정도 가능

 

결과

Image 를 사용할때 코드 상에서 이미지 경로를 지정 할때

아래 처럼 사용합니다.

 

 

BitmapImage result = new BitmapImage();

result.BeginInit();

result.UriSource = new Uri(@"C:\Users\my\Desktop\100.PNG");

result.EndInit();

 

// Image control

this.resultImage.Source = result;

 

 

Fiddler(피들러)는 무엇인가???


 - 피들러는 Web Debug 툴이라고 할 수 있다.


 - HTTP와 HTTPS 의 프로토콜을 캡처하고 분석할수 있는 프리웨어 http 디버깅 툴


 - 주로 트래픽 조작, 기능 확장, 분석, 모니터링 등에 유용하다.


https://www.telerik.com/fiddler


+ Recent posts